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

Clasificación/recopilación/orden incorrecto con espacios en Postgresql 9.4

En Unix/Linux SE, un amable experto explicó que lo que ve es la forma correcta de ordenar Unicode. Básicamente, el estándar está tratando de ordenar:

di Silva Fred                  di Silva Fred
di Silva John                  diSilva Fred
diSilva Fred                   disílva Fred
diSilva John         ->        di Silva John
disílva Fred                   diSilva John
disílva John                   disílva John

Ahora bien, si los espacios fueran tan importantes como las letras, el género no podría separar las diversas ortografías idénticas de Fred y John. Entonces, lo que sucede es que primero ordena sin espacios. Luego, en un segundo paso, se ordenan las cadenas que son iguales sin espacios en blanco. (Esto es una simplificación, el algoritmo real parece bastante complejo, asignando varios niveles de precedencia a espacios en blanco, acentos y caracteres no imprimibles).

Puede omitir la intercalación de Unicode configurando:

export LC_ALL=C

O en Postgres mediante conversión a matriz de bytes para ordenar:

order by name::bytea

O (de la respuesta de Kiln) especificando C colación:

order by name collate "C"

O modificando la intercalación predeterminada para la columna:

alter table products alter column name type text collate "C";