Tengo Postgres 9.4.4 ejecutándose en Debian y obtengo el siguiente ORDER BY
comportamiento:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
Y uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Sin embargo, en mi iMac, con Postgres 9.3.4, obtengo lo siguiente:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
A
CD
Capacitor
D
a
b
c
d
(8 rows)
Y el uname -a
:
Darwin ---- 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64
Me desconcierta por qué la versión de Debian parece no distinguir entre mayúsculas y minúsculas y la versión de OS X no. ¿Qué me estoy perdiendo o qué otra información necesito proporcionar?
Actualización : en mi Mac, la pg_collation
tabla muestra que tengo una en_US.UTF-8
clasificación, pero en Debian, tengo una en_US.utf8
clasificación. Por lo tanto, en mi Mac:
veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
)
SELECT bar FROM foo
ORDER BY bar collate "en_US.UTF-8";
bar
-----------
A
CD
Capacitor
D
a
b
c
d
(8 rows)
Y en Debian:
veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
)
SELECT bar FROM foo
ORDER BY bar collate "en_US.utf8";
bar
-----------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
Entonces, ¿ en_US.UTF-8
y en_US.utf8
tiene diferentes órdenes de clasificación?
postgresql
collation
Curtis Poe
fuente
fuente
'D d a A c b CD Capacitor'
Hay alguna posibilidad de que la cadena no se arroje como untext
campo en la Mac? IE, intentaSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
ver qué pasa ...select * from pg_collation
muestra el cuadro de Debianen_US.utf8
, mientras que el OS X síen_US.UTF-8
. El uso de estos para forzar explícitamente la ordenación en los cuadros respectivos muestra diferentes órdenes de clasificación :(Respuestas:
No, estos dos son iguales, solo una convención de nomenclatura diferente.
Sí, estás en lo correcto. Este es el comportamiento predeterminado en Mac. Las intercalaciones no funcionan en ningún sistema operativo BSD-ish (incluido OSX) para la
UTF8
codificación.Aquí hay una referencia para demostrar que:
Problemas con el orden de clasificación (las configuraciones regionales UTF8 no funcionan
Como dijo a_horse_with_no_name , Postgres usa la implementación de intercalación del sistema operativo. No hay forma de obtener el mismo resultado en ambos sistemas operativos.
En su caso, usted puede (i dicho tal vez) hacer como esto:
ORDER BY lower(fieldname)
.fuente
ORDER BY function()
en conjuntos de resultados potencialmente grandes, ya que detiene el uso de un índice para la clasificación, seguramente causará una operación de clasificación adicional (posiblemente en el disco) y puede cambiar el método del planificador de consultas para atacar su consulta más ampliamente .