Ich habe Postgres 9.4.4 unter Debian und bekomme folgendes ORDER BY
Verhalten:
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)
Und uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Auf meinem iMac mit Postgres 9.3.4 erhalte ich jedoch Folgendes:
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)
Und die 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
Es ist mir ein Rätsel, warum bei der Debian-Version die Groß- und Kleinschreibung nicht beachtet wird und bei der OS X-Version nicht. Was fehlt mir oder welche weiteren Informationen muss ich bereitstellen?
Update : Auf meinem Mac zeigt die pg_collation
Tabelle, dass ich eine en_US.UTF-8
Kollatierung habe, aber auf Debian habe ich eine en_US.utf8
Kollatierung. So auf meinem 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)
Und unter 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)
Also en_US.UTF-8
und en_US.utf8
unterschiedliche Sortierreihenfolgen?
postgresql
collation
Curtis Poe
quelle
quelle
'D d a A c b CD Capacitor'
nicht alstext
Feld geworfen wird ? IE, versuchen SieSELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
und sehen, was passiert ...select * from pg_collation
die Debian-Box haten_US.utf8
, während das OS X haten_US.UTF-8
. Wenn Sie diese verwenden, um die Sortierung explizit für die jeweiligen Felder zu erzwingen, werden unterschiedliche Sortierreihenfolgen angezeigt: (Antworten:
Nein, beide sind gleich, nur eine andere Namenskonvention.
Ja du hast Recht. Dies ist das Standardverhalten auf einem Mac. Kollatierungen funktionieren nicht auf BSD-basierten Betriebssystemen (einschließlich OSX) für die
UTF8
Codierung.Hier ist ein Hinweis, um zu beweisen, dass:
Probleme mit der Sortierreihenfolge (UTF8-Gebietsschemas funktionieren nicht
Wie a_horse_with_no_name sagte, verwendet Postgres die Kollatierungsimplementierung vom Betriebssystem. Es gibt keine Möglichkeit, auf beiden Betriebssystemen dasselbe Ergebnis zu erzielen.
In Ihrem Fall können Sie (ich sagte , vielleicht) zu tun wie folgt aus :
ORDER BY lower(fieldname)
.quelle
ORDER BY function()
von potenziell großen Ergebnismengen zu überprüfen. Da ein Index für die Sortierung nicht mehr verwendet wird, führt dies mit ziemlicher Sicherheit zu einer zusätzlichen Sortierung (möglicherweise auf Datenträger) und kann die Methode des Abfrageplaners ändern, mit der Ihre Abfrage weiter angegriffen wird .