Re: Probleme mit selbst definiertem ORDER BY

From: Andreas Seltenreich <seltenreich(at)gmx(dot)de>
To: "Goran V(dot)" <postmaschine(at)gmail(dot)com>
Cc: pgsql-de-allgemein-owner(at)postgresql(dot)org
Subject: Re: Probleme mit selbst definiertem ORDER BY
Date: 2005-06-08 18:37:53
Message-ID: 871x7cofsu.fsf@gate450.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

(bitte die Diskussion auf der Liste lassen)

Goran V. writes:

> Hi Andreas! Danke wieder für die schnelle Hilfe.

"wieder"? Ist AFAIK das erste mal :-)

>> Bis hier hin ist es ja genau die Sortierung, die bei einem
>>
>> initdb -E iso-8859-1 --locale=de_DE
>>
>> herauskommt.
>
> Warum ein initdb? Laut man-page benötige ich das doch nur für
> "geclusterte" Datenbanken?

Nein, für den "Datenbank-Cluster", ohne den gibt es keine Datenbanken.
Wenn du mit initdb keinen Cluster erstellt hast, hat das womöglich
Paketverwaltung oder der Windows-Installer für dich gemacht.

> Reicht nicht ein "createdb -E iso-8859-1"?

Nein. Entscheidend ist das Locale, genauer LC_COLLATE für die
Sortierung, und die wird beim Initialisieren des Clusters festgelegt.

Kommentar von Peter Eisentraut in pg_locale.c:
--8<---------------cut here---------------start------------->8---
* Here is how the locale stuff is handled: LC_COLLATE and LC_CTYPE
* are fixed by initdb, stored in pg_control, and cannot be changed.
* Thus, the effects of strcoll(), strxfrm(), isupper(), toupper(),
* etc. are always in the same fixed locale.
--8<---------------cut here---------------end--------------->8---

...wobei strcoll() für's ORDER BY verwendet wird.

> Nachdem ich so eine DB "timetable" erstellte zeigte mir ein "\l" folgendes:
>
> List of databases
> Name | Owner | Encoding
> -----------+----------+-----------
> template0 | postgres | SQL_ASCII
> template1 | postgres | SQL_ASCII
> timetable | db_admin | LATIN1
>
> So weit so gut. Dann habe ich die Datenbank bisschen gefüttert und ein
> "SELECT oid, * FROM station ORDER BY name_station ASC;"
>
> lieferte mir:
>
> oid | id_station | name_station
> -------+------------+--------------
> 17688 | 6 | AA
> 17690 | 8 | Aa
> 17685 | 3 | C C
> 17684 | 2 | C-C
> 17683 | 1 | CC
> 17686 | 4 | C_C
> 17689 | 7 | aA
> 17687 | 5 | aa
> 17693 | 11 | Ü a
> 17692 | 10 | äA
> 17691 | 9 | ää
> (11 rows)
>
> Nichts zu sehen von einer passenden Sortierung. Mmh, mache ich alles
> falsch?

Das encoding alleine genügt nicht, wie oben schon geschrieben, muß das
Locale passend gesetzt sein:

--8<---------------cut here---------------start------------->8---
scratch=# show lc_collate;
lc_collate
------------
de_DE
(1 row)

scratch=# select w from foo order by w;
w
---

_
-
a
A
ä
Ä
o
O
ö
Ö
ß
u
U
ü
Ü
(16 rows)
--8<---------------cut here---------------end--------------->8---

Gruß
Andreas

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Manfred Rebentisch 2005-06-10 15:19:47 Reicht PQclear nach einem Error?
Previous Message Andreas Seltenreich 2005-06-08 17:15:10 Re: Probleme mit selbst definiertem ORDER BY