FAQ: podivne trideni v pgsql 7.1.3, delam chybu ja nebo postgres?
Karel Zak
zakkr na zf.jcu.cz
Čtvrtek Leden 10 13:17:21 CET 2002
On Thu, Jan 10, 2002 at 11:03:12AM +0100, Pavel Lisy wrote:
> Narazili jsme na problem s ceskym tridenim v PostgreSQL 7.1.3
Oblibe ne tema. Dobra, tak tedy kompletene, ale uz naposledy...
1) je nutne mit PostgreSQL kompilovan s --enable-locale, v pripade
chuti pouzit unicode tak i --enable-multibyte (apod.)
(poznamka k 7.2: --enable-nls, --enable-multibyte --enable-locale
znamena podporu LS_MESSAGES (error hlasky v napr. cestine),
podpora unicode, podpora locales)
- vice viz ./configure --help
2) po nainstalovani je nutne udelat inicializaci adresare do ktereho
se ukladaji databaze:
Inicializaci je nutne provadet pod jinym nez root uzivatelem)
# su - postgres
PostgreSQL ignoruje u LC_COLLATE a LC_CTYPE nastaveni jine nez bylo
provedene pri inicializaci. Tedy pozdejsi zmena v nejakem starovacim
skriptu nema efekt! Duvodem je nutnost udrzet konzistentni indexy
apod.
$ export LANG='cs_CZ'
Vlastni inicializace:
$ initdb -D /adresar/nekde/
3) start PostgreSQL serveru
4) dalsi zakladni nastaveni
# su - postgres
$ createuser muj_admin
$ createdb nejaka_db
5) pouzivani:
- chcete-li pouzivat data v nejakem kodovani musite mit, DB
ktera to podporuje:
CREATE DATABASE neco WITH ENCODING = 'LATIN2'
Lze i pouzivat "obecne" kodovani napr. UNICODE, MULE_INTERNAL.
- server musi vedet jake kodovani pouziva klient, to lze provest
na strane klient napriklad pomoci "export PGCLIENTENCODING='LATIN2'",
nebo pomoci SQL prikazu SET CLIENT_ENCODING TO 'LATIN2';
Toto nastaveni je platne pro daneho klienta. K jedne DB (napr. v
UNICODE) muze pristupovat vice klientu s ruznym kodovanim.
- server je schopen prekodovavat za chodu, napr. z UNICODE do
LATIN2, WIN1250 apod.
- informaci o nastaveni kodovani zjistite pomoci:
SHOW SERVER_ENCODIND;
SHOW CLIENT_ENCODING;
Jednoduchy test:
* vytvorit soubor s obsahem:
SHOW CLIENT_ENCODING;
SHOW SERVER_ENCODING;
CREATE TABLE aaa (data varchar(16), dec varchar(3));
COPY aaa FROM stdin;
YYYY 87
áááá 225
AAAA 65
žžžž 190
ÝÝÝÝ 221
aaaa 97
bbbb 98
tttt 116
šššš 185
ýýýý 253
\.
SELECT * FROM aaa ORDER BY data;
DROP TABLE aaa;
a pak ho nasmerovat na klient:
$ export PGCLIENTENCODING='LATIN2'
$ pgsql moje_latin2_db < soubor
vysledek:
NOTICE: Current client encoding is 'LATIN2'
SHOW VARIABLE
NOTICE: Current server encoding is 'LATIN2'
SHOW VARIABLE
CREATE
data | dec
------+-----
AAAA | 65
aaaa | 97
áááá | 225
bbbb | 98
šššš | 185
tttt | 116
YYYY | 87
ÝÝÝÝ | 221
ýýýý | 253
žžžž | 190
(10 řádek)
DROP
Karel
PS. uvedeny priklad je z PG 7.2.
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz
Další informace o konferenci Linux