Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PostgreSQL] Sortowanie polskich znaków w UTF-8 pod Windowsem

1,883 views
Skip to first unread message

Kamil Zeno

unread,
Feb 20, 2007, 9:05:16 AM2/20/07
to
Witam Państwa

Mam problem z sortowaniem polskich znaków w UTF-8
na PostgreSQL 8.2, który stoi (... ech...) na Windowsie XP :/
Niestety póki co tak musi być i zanim przejdę na Linuxa, to
trochę czasu minie, a sortowanie musi już teraz działać poprawnie.
Błąd polega na tym, że ogonki są wyswietlane na końcu.
Przeszukałem google i wiem, że trzeba pogrzebać w zmiennych
środowiskowych locale, ale gdzie one są w Windowsie?
Aha, kodowanie musi być UTF-8, tego nie mogę zmienić :/

Dzięki za pomoc.

Kamil.

Herakles

unread,
Feb 20, 2007, 3:37:57 PM2/20/07
to
Kamil Zeno wrote:

> óki co tak musi być i zanim przejdę na Linuxa, to
> trochę czasu minie, a sortowanie musi już teraz działać poprawnie.
> Błąd polega na tym, że ogonki są wyswietlane na końcu.
> Przeszukałem google i wiem, że trzeba pogrzebać w zmiennych
> środowiskowych locale, ale gdzie on

1) Jak masz bazę jednojęzyczną to inicjując cluster;
initdb --locale=pl_PL.UTF-8 (nie wiem jak to się robi w łindołsach.
2) nls_string (też nie wiem, czy to dygnie na łindowsach.
3) wypier.. te łindowsy.

Kamil Zeno

unread,
Feb 21, 2007, 2:40:58 AM2/21/07
to
Użytkownik "Herakles" <hera...@buziaczek.pl> napisał w wiadomości
news:erfm5m$sea$1...@atlantis.news.tpi.pl...

> 1) Jak masz bazę jednojęzyczną to inicjując cluster;
> initdb --locale=pl_PL.UTF-8 (nie wiem jak to się robi w łindołsach.
> 2) nls_string (też nie wiem, czy to dygnie na łindowsach.
> 3) wypier.. te łindowsy.

Ech... najłatwiej powiedzieć: wyper... Windowsa :/
Muszę chyba zrobić konferencję z klientem i przekonać
go do Linuxa, a jednocześnie uświadomić, że wyrzucił
pieniądze w błoto, kupując Windowsy.

Kamil.

Artur Muszynski

unread,
Feb 21, 2007, 3:34:38 AM2/21/07
to
Kamil Zeno wrote:
> Ech... najłatwiej powiedzieć: wyper... Windowsa :/
> Muszę chyba zrobić konferencję z klientem i przekonać
> go do Linuxa, a jednocześnie uświadomić, że wyrzucił
> pieniądze w błoto, kupując Windowsy.

Nie wiem, ja używam pgsql pod linuxem i windowsami i z żadnym nie mam
problemów. Zanim zaczniesz zrywać podłogę, sprawdź na czymś prostym i
skutecznym, np pgAdminie.

artur

Kamil Zeno

unread,
Feb 21, 2007, 3:49:03 AM2/21/07
to
Użytkownik "Artur Muszynski" <art...@union.wytnijto.com.pl> napisał w
wiadomości news:erh49u$jc3$1...@mx1.internetia.pl...

> Nie wiem, ja używam pgsql pod linuxem i windowsami i z żadnym nie mam
> problemów. Zanim zaczniesz zrywać podłogę, sprawdź na czymś prostym i
> skutecznym, np pgAdminie.
>
> artur

pgAdmin:
create table t1(a char);
show server_encoding;

zwraca UTF-8

insert into t1 values('a');
insert into t1 values('ą');
insert into t1 values('ł');
insert into t1 values('z');
insert into t1 values('ż');

select a from t1 order by a;
wynik:
a
z
ą
ł
ż

:/

Kamil

Ronald Kuczek

unread,
Feb 21, 2007, 7:56:47 AM2/21/07
to
Kamil Zeno napisał(a):

> Aha, kodowanie musi być UTF-8, tego nie mogę zmienić :/

Hmm.. a próbowałeś server_encoding na latin2 a client_encoding na
unicode ? To może zadziałać.


Pozdrawiam
Rony

Kamil Zeno

unread,
Feb 21, 2007, 8:40:18 AM2/21/07
to
Użytkownik "Ronald Kuczek" <kuc...@kuczek.pl> napisał w wiadomości
news:erhfjm$1hf$1...@atlantis.news.tpi.pl...

> Hmm.. a próbowałeś server_encoding na latin2 a client_encoding na unicode
> ? To może zadziałać.

client_encoding próbowałem już na unicode, utf-8, latin2
a zaś jak dodam server_encoding do postgresql.conf to
po restarcie serwera, nie uruchamia się ponownie :| Nie
ma takiej właściwości? Dziwne.

Kamil.

Ronald Kuczek

unread,
Feb 21, 2007, 9:01:43 AM2/21/07
to
Kamil Zeno napisał(a):

> client_encoding próbowałem już na unicode, utf-8, latin2
> a zaś jak dodam server_encoding do postgresql.conf to
> po restarcie serwera, nie uruchamia się ponownie :| Nie
> ma takiej właściwości? Dziwne.
>

Kodowanie po stronie serwera ustalasz podczas tworzenia bazy (btw. każda
może mieć inne, to zależy tylko od Ciebie).
Proponowałem, abyś założył bazę z kodowaniem LATIN2
a po stronie klienta ustawił sobie unicode i tak wprowadzał dane.
Z dokumentacji wynika, że to powinno zadziałać (patrz 17.10. Client
Connection Defaults).
BTW. u mnie działa - 8.1, XP Pro SP2


Pozdrawiam
Rony

Filip Rembiałkowski

unread,
Feb 22, 2007, 5:26:51 AM2/22/07
to

select * from pg_settings where name like 'lc_%'

za sortowanie odpowiada lc_collate.
jedynym sposobem jego zmiany jest ponowne wywołanie initdb.
czyli :

pg_dumpall > backup/all.sql
cp $PGDATA/*.conf backup/
pg_ctl stop
rm -rf $PGDATA
initdb --locale=pl_PL ( pod win32 locale może się nazywać inaczej )
cp backup/*.conf $PGDATA/
pg_ctl start
psql < backup/all.sql

Herakles

unread,
Feb 22, 2007, 5:38:03 AM2/22/07
to
Filip Rembiałkowski wrote:

i tu od nowa popełniasz błąd, który już został popełniony:
initdb --locale=pl_PL.UTF-8 ( pod win32 locale może się nazywać inaczej )

ir...@mud.pl

unread,
Feb 22, 2007, 11:47:48 AM2/22/07
to
Kamil Zeno wrote:

> Muszę chyba zrobić konferencję z klientem i przekonać
> go do Linuxa,


a po co do Linux-a ?

namów go na jakiegos risc-a - np: z AIX-em

klient bedzie szcześliwy , ty zarobisz troche kasy. Za administrowaniem
systeme bedziesz brał wiecej niz za te łindołsy

--
p.
Irek

Kamil Zeno

unread,
Feb 23, 2007, 5:19:16 AM2/23/07
to
Użytkownik "Herakles" <hera...@buziaczek.pl> napisał w wiadomości
news:erjrup$l7g$1...@nemesis.news.tpi.pl...

> Filip Rembiałkowski wrote:
> i tu od nowa popełniasz błąd, który już został popełniony:
> initdb --locale=pl_PL.UTF-8 ( pod win32 locale może się nazywać inaczej )

Otrzymuję taki komunikat:
initdb: invalid locale name "pl_PL.UTF-8"
A potem:
The databaes cluster will be initialized with locale Polish_Poland.1250.

Zresztą pl_PL też nie zrozumiał.

:/

Kamil

Kamil Zeno

unread,
Feb 23, 2007, 5:31:19 AM2/23/07
to
Hehe, co nie zmienia faktu, że teraz poprawnie sortuje :)
Już nic z tego nie rozumiem :)

Kamil.

Kamil Zeno

unread,
Feb 23, 2007, 5:33:23 AM2/23/07
to
lc_collate ma teraz wartość (kolumna setting): Polish_Poland.1250
Wcześnie to pole było puste (albo miało wartość C), nie pamiętam,
ale na pewno nie było tego co jest teraz (kodowanie windowsowe?)

Kamil.

Herakles

unread,
Feb 23, 2007, 6:06:41 AM2/23/07
to
Kamil Zeno wrote:

a spróbuj na hama: Polish_Poland.UTF-8 albo Polish_Poland.UNICODE
Nie byłbym taki pewien, czy dobrze sortuje, ba jak sam piszesz masz bazę w
unicode i jak wrzucisz do tej bazy w Polish_Poland.1250 bazę w unikodzie to
poraszka.

Rafał Korszuń

unread,
Feb 23, 2007, 6:11:15 AM2/23/07
to
Herakles napisał(a):

> Kamil Zeno wrote:
>
>
> a spróbuj na hama: Polish_Poland.UTF-8 albo Polish_Poland.UNICODE
> Nie byłbym taki pewien, czy dobrze sortuje, ba jak sam piszesz masz bazę w
> unicode i jak wrzucisz do tej bazy w Polish_Poland.1250 bazę w unikodzie to
> poraszka.
>
>
> .
>
>
Może sie przydać : locale dla iso-88592-2 pod windowsem to
Polish_Poland.28592

Pozdrawiam

--
Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych

Rafał Korszuń

unread,
Feb 23, 2007, 6:14:05 AM2/23/07
to
Rafał Korszuń napisał(a):
> Herakles napisał(a):

>
>
> Może sie przydać : locale dla iso-88592-2 pod windowsem to
> Polish_Poland.28592
>
> Pozdrawiam
>

a polski utf-8 to podobno Polish_Poland.65001
ale nie testowałem więc nie powiem czy działa

Pozdrawiam Rafał

Kamil Zeno

unread,
Feb 23, 2007, 6:40:49 AM2/23/07
to
Użytkownik ""Rafał Korszuń"" <ra...@korszun.com> napisał w wiadomości
news:45DECC50...@korszun.com...

> Rafał Korszuń napisał(a):
>> Herakles napisał(a):
>> Może sie przydać : locale dla iso-88592-2 pod windowsem to
>> Polish_Poland.28592
>>
>> Pozdrawiam
>>
>
> a polski utf-8 to podobno Polish_Poland.65001
> ale nie testowałem więc nie powiem czy działa
>

Polish_Poland.28592 działa i też jest dobrze posortowane :|
Stworzyłem na nowo tą tabelkę t1, tak jak pisałem kilka postów
wyżej i poprawnie posortowało.
Natomiast 65001 nie rozpoznaje i ustawia się na 1250 :/

Kamil.


Artur Muszynski

unread,
Feb 23, 2007, 10:36:51 AM2/23/07
to
Herakles wrote:
> a spróbuj na hama: Polish_Poland.UTF-8 albo Polish_Poland.UNICODE
> Nie byłbym taki pewien, czy dobrze sortuje, ba jak sam piszesz masz
> bazę w unicode i jak wrzucisz do tej bazy w Polish_Poland.1250 bazę w
> unikodzie to poraszka.

Warto też zwrócić uwagę, że pgsql ma podobnie jak mysql możliwość ustawienia
przekodowywania znaków między klientem a serwerem, np:
SET CLIENT_ENCODING TO 'UTF8'
albo w PHP:
pg_set_client_encoding('UTF8');
Przyczyny złego kodowania mogą być 2: albo nieprawidłowe ustawienie
kodowania bazy, albo nieprawidłowe kodowanie na kliencie. Dlatego pisałem o
jakimś sprawdzonym narzędziu, żeby wyeliminować tę drugą przyczynę.

artur

0 new messages