it-swarm.com.de

Warum wird bei PostgreSQL ORDER BY nicht zwischen Groß- und Kleinschreibung unterschieden?

Ich habe Postgres 9.4.4 unter Debian ausgeführt und erhalte das folgende 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 der 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

Ich bin verwirrt darüber, warum bei der Debian-Version die Groß- und Kleinschreibung nicht berücksichtigt wird und bei der OS X-Version nicht. Was fehlt mir oder welche anderen Informationen muss ich bereitstellen?

pdate: Auf meinem Mac zeigt die Tabelle pg_collation, Dass ich eine en_US.UTF-8 - Kollatierung habe, auf Debian jedoch eine en_US.utf8 - Kollatierung. Also 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 auf 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 haben en_US.UTF-8 Und en_US.utf8 Unterschiedliche Sortierreihenfolgen?

29
Curtis Poe

Also haben en_US.UTF-8 Und en_US.utf8 Unterschiedliche Sortierreihenfolgen?

Nein, beide sind gleich, nur eine andere Namenskonvention.

Ich bin verwirrt darüber, warum bei der Debian-Version die Groß- und Kleinschreibung nicht berücksichtigt wird und bei der OS X-Version nicht.

Ja du hast Recht. Dies ist das Standardverhalten auf dem Mac. Kollatierungen funktionieren unter keinem BSD-ähnlichen Betriebssystem (inkl. OSX) für die UTF8 - Codierung.

Hier ist eine Referenz, 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 das gleiche Ergebnis zu erzielen.

In Ihrem Fall können Sie (ich sagte vielleicht) Folgendes tun: ORDER BY lower(fieldname).

19
JSapkota