Falsche Sortierreihenfolge bei UTF8

Hallo zusammen,

wir haben folgendes Problem: obwohl wir unsere Datenbank mit UTF8 inizialisiert haben ergeben Selects mit ORDER BY eine falsche Sortierreihenfolge in der Form

A
B
Z
a
z
Ä
ä
ö

Wir sind folgendermaßen vorgegangen:

  1. initdb -U testnutzer -E UTF-8 --locale=de_DE.UTF-8 -D /testdaten
  2. pg_ctl -U testnutzer -D /testdaten -l logfile start
  3. createdb -U testnutzer testdb
  4. create table testtable(c1 text) über das Admintool
  5. diverse Testdaten per INSERT eingefügt:

insert into testtable values(‘Adam’);
insert into testtable values(‘adam’);
insert into testtable values(‘Berta’);
insert into testtable values(‘Öl’);
insert into testtable values(‘Mann’);
insert into testtable values(‘Zoo’);
insert into testtable values(‘Zoodirektor’);
insert into testtable values(‘Äpfel’);
insert into testtable values(‘äpfel’);

  1. SELECT:

select * from testtable order by c1 asc

ergibt folgendes Ergebnis

“Adam”
“Berta”
“Mann”
“Zoo”
“Zoodirektor”
“adam”
“Äpfel”
“Öl”
“äpfel”

anstatt der gewünschten Reihenfolge:

“adam”
“Adam”
“äpfel”
“Äpfel”
“Berta”
“Mann”
“Öl”
“Zoo”
“Zoodirektor”

“locale -a” ergibt (u.a.) folgendes:

de_DE
de_DE.ISO8859-1
de_DE.ISO8859-15
de_DE.UTF-8

Und “psql -l” ergibt dieses Ergebnis:

List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
----------±----------±---------±------------±------------±----------------------------------
postgres | testnutzer | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |
template0 | testnutzer | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | =c/testnutzer
: testnutzer =CTc/testnutzer
template1 | testnutzer | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | =c/testnutzer
: testnutzer =CTc/testnutzer
test | testnutzer | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |


Was genau machen wir falsch? Gibt es noch andere Einstellungen die vorgenommen werden müssen, damit die gewünschte Sortierung erfolgt?

Vielen Dank im Voraus für eure Hilfe!

Viele Grüße,
Stefan H.

works for me:

test=# create table testtable(c1 text);
CREATE TABLE
test=*# insert into testtable values('Adam');
INSERT 0 1
test=*# insert into testtable values('adam');
INSERT 0 1
test=*# insert into testtable values('Berta');
INSERT 0 1
test=*# insert into testtable values('Öl');
INSERT 0 1
test=*# insert into testtable values('Mann');
INSERT 0 1
test=*# insert into testtable values('Zoo');
INSERT 0 1
test=*# insert into testtable values('Zoodirektor');
INSERT 0 1
test=*# insert into testtable values('Äpfel');
INSERT 0 1
test=*# insert into testtable values('äpfel');
INSERT 0 1
test=*# select * from testtable order by c1 asc;
     c1
-------------
 adam
 Adam
 äpfel
 Äpfel
 Berta
 Mann
 Öl
 Zoo
 Zoodirektor
(9 rows)

test=*# show lc_collate;
 lc_collate
-------------
 en_US.UTF-8
(1 row)

test=*#

Auf was steht lc_collate?

Andreas

Auf was steht lc_collate?


test=# show lc_collate;
 lc_collate
-------------
 de_DE.UTF-8
(1 row)

lc_collate steht auf… siehe oben. So wie bei der Initialisierung angegeben. Oder ist das falsch?

Was mir aufgefallen ist: wenn ich über psql die Testdaten eingebe dann kann ich keine Umlaute verwenden. Für ä,ö oder ü erscheint immer nur ein “?”. Und es kommt folgende Fehlermeldung:

ERROR:  invalid byte sequence for encoding "UTF8": 0xc36c
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

Das Ganze passiert auf jedem Rechner. Egal ob Leopard oder Snow Leopard. Egal ob alt oder neu…

CLIENT_ENCODING steht übrigens auch auf…

test=# show client_encoding;
 client_encoding 
-----------------
 utf8
(1 row)

Wenn ich mit --locale=de_DE.ISO8859-15 und --encoding=LATIN9 initialisiere, dann bekomme ich immerhin schon mal folgendes Ergebnis:

     c1
-------------
 Adam
 Äpfel
 Berta
 Mann
 Öl
 Zoo
 Zoodirektor
 adam
 äpfel
(9 rows)