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