sql >> Base de Datos >  >> RDS >> PostgreSQL

Clasificación incorrecta de PostgreSQL

Ordenar el comportamiento del texto (incluido char y varchar así como el text tipo) depende de la intercalación actual de su localidad.

Consulte las preguntas anteriores estrechamente relacionadas:

  • Orden PostgreSQL
  • https://stackoverflow.com/q/21006868/398670

Si desea hacer una clasificación simplista por valor ASCII, en lugar de una clasificación correctamente localizada siguiendo las reglas de su idioma local, puede usar el COLLATE cláusula

select * 
from test
order by title COLLATE "C" ASC

o cambiar la intercalación de la base de datos globalmente (requiere volcado y recarga, o reindexación completa). En mi sistema Linux Fedora 19, obtengo los siguientes resultados:

regress=> SHOW lc_collate;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#')) 
          SELECT title FROM v ORDER BY title ASC;
 title 
-------
 #
 a
 #a
 a#
 a#a
(5 rows)

regress=> WITH v(title) AS (VALUES ('#a'), ('a'), ('#'), ('a#a'), ('a#')) 
          SELECT title FROM v ORDER BY title COLLATE "C" ASC;
 title 
-------
 #
 #a
 a
 a#
 a#a
(5 rows)

PostgreSQL utiliza la compatibilidad de intercalación de su sistema operativo, por lo que es posible que los resultados varíen ligeramente de un sistema operativo host a otro. En particular, al menos algunas versiones de Mac OS X han roto significativamente el manejo de intercalación Unicode.