Herramientas de usuario

Herramientas del sitio


problem_with:sort

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
problem_with:sort [2015/11/26 16:54] barrachiproblem_with:sort [2024/10/27 11:37] (actual) – [PostgreSQL y ordenación alfabética errónea con espacios y ñ] barrachi
Línea 3: Línea 3:
 Al ordenar una tabla de PostgreSQL por apellidos, utilizando la colación «es_ES.UTF-8», se aprecian dos cuestiones, que a mi modo de ver, no son correctas. La primera de ellas es que el espacio que separa los dos apellidos no se tiene en cuenta y apellidos del tipo «Martín X» acaban intercalados con los «Martínez Y», cuando lo esperable, sería ver a todos los que tienen como primer apellido «Martín» antes de los «Martínez». El segundo de los problemas es que no se hace distinción entra la letra «ñ» y la «n», se considera a la «ñ» como una «n» acentuada y, por tanto, también se intercalan entradas que tienen una «n» en una determinada posición con filas que tienen «ñ» en la misma posición. Cuando en realidad debería considerarse la «ñ» como una letra cuyo orden de colación está entre la «n» y la «o». Al ordenar una tabla de PostgreSQL por apellidos, utilizando la colación «es_ES.UTF-8», se aprecian dos cuestiones, que a mi modo de ver, no son correctas. La primera de ellas es que el espacio que separa los dos apellidos no se tiene en cuenta y apellidos del tipo «Martín X» acaban intercalados con los «Martínez Y», cuando lo esperable, sería ver a todos los que tienen como primer apellido «Martín» antes de los «Martínez». El segundo de los problemas es que no se hace distinción entra la letra «ñ» y la «n», se considera a la «ñ» como una «n» acentuada y, por tanto, también se intercalan entradas que tienen una «n» en una determinada posición con filas que tienen «ñ» en la misma posición. Cuando en realidad debería considerarse la «ñ» como una letra cuyo orden de colación está entre la «n» y la «o».
  
-Al parecer, esto no es en realidad un problema de PostgreSQL, ya que éste utiliza el orden de colación del sistema operativo en el que se ejecuta [1]. Así pues, el problema, o el supuesto problema, si es que esa es la ordenación correcta, está provocado por la definición de colación utilizada por glibc en su variante «es_ES». Puesto que el fallo en la ordenación es debido al orden de colación del sistema, el mismo error se puede reproducir utilizando el comando ''sort''.+Al parecer, esto no es en realidad un problema de PostgreSQL, ya que éste utiliza el orden de colación del sistema operativo en el que se ejecuta~[1]. Así pues, el problema, o el supuesto problema, si es que esa es la ordenación correcta, está provocado por la definición de colación utilizada por glibc en su variante «es_ES». Puesto que el fallo en la ordenación es debido al orden de colación del sistema, el mismo error se puede reproducir utilizando el comando ''sort''.
  
 Así pues, dado un fichero ''lista.txt'' con el siguiente contenido: Así pues, dado un fichero ''lista.txt'' con el siguiente contenido:
Línea 20: Línea 20:
 </code> </code>
  
-Si se ejecuta el comando ''LC_COLLATE="es_US.UTF-8" sort lista.txt'', se obtiene:+Si se ejecuta el comando ''LC_COLLATE="es_ES.UTF-8" sort lista.txt'' (cuidado con las comillas dobles si se copia este comando), se obtiene:
  
 <code> <code>
Línea 29: Línea 29:
 ab b # 05 ab b # 05
 na a # 06 na a # 06
-ña a # 08 
 nb a # 07 nb a # 07
-ñb a # 09 
 oa a # 10 oa a # 10
 +ña a # 08
 +ñb a # 09
 </code> </code>
  
 ==== Posible solución ==== ==== Posible solución ====
  
-Una posible solución es modificar la definición de la colación para la localización «es_ES». Al hilo de lo comentado en [2], las modificaciones que habría que hacer son las siguientes.+Una posible solución es modificar la definición de la colación para la localización «es_ES». Al hilo de lo comentado en~[2], las modificaciones que habría que hacer son las siguientes.
  
 En primer lugar, para hacer que el espacio se tenga en cuenta cuando se están ordenando entradas, se deben añadir las siguientes líneas en el fichero ''/usr/share/i18n/locales/es_ES'' justo antes de la línea ''END LC_COLLATE'': En primer lugar, para hacer que el espacio se tenga en cuenta cuando se están ordenando entradas, se deben añadir las siguientes líneas en el fichero ''/usr/share/i18n/locales/es_ES'' justo antes de la línea ''END LC_COLLATE'':
Línea 64: Línea 64:
  
 <code> <code>
-systemctl stop apache+locale-gen 
 +systemctl stop apache2
 systemctl restart postgresql systemctl restart postgresql
-systemctl start apache+systemctl start apache2
 </code> </code>
  
problem_with/sort.1448556850.txt.gz · Última modificación: 2015/11/26 16:54 por barrachi