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:
initdb -U testnutzer -E UTF-8 --locale=de_DE.UTF-8 -D /testdaten
pg_ctl -U testnutzer -D /testdaten -l logfile start
createdb -U testnutzer testdb
create table testtable(c1 text) über das Admintool
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’);
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.
revolverdeveloper:
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:
initdb -U testnutzer -E UTF-8 --locale=de_DE.UTF-8 -D /testdaten
pg_ctl -U testnutzer -D /testdaten -l logfile start
createdb -U testnutzer testdb
create table testtable(c1 text) über das Admintool
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’);
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)