From: | Stephane Bunel <stephane(at)stratum-ip(dot)net> |
---|---|
To: | Daniel Verite <daniel(at)manitou-mail(dot)org> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: invalid multibyte character for locale |
Date: | 2005-03-05 01:36:06 |
Message-ID: | 42290D06.5020206@stratum-ip.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Daniel Verite wrote:
> Stéphane Bunel wrote:
>
>
>>Dans le cas de upper()/lower()..., je penche pour un comportement
>>modifié dans le cas de chaîne multibyte. Là ou PG7.4 ne cherchait pas à
>>interpréter un caractère non "compris" comme pouvant être mis en
>>majuscule, cas pour upper(), tel qu'un 'é'. PG7.4 recopie tout
>>simplement le caractère. Alors que PG8 échoue s'il n'est pas capable de
>>trouver une conversion. Il serait plus strict que PG7.4 ou alors
>
>
> Oui il est plus strict, et c'est relatif au serveur lui-même.
> La solution est d'initialiser dès le départ le cluster avec une "locale"
> compatible avec l'utf-8.
>
> Par exemple
> initdb -E UNICODE --locale=fr_FR.utf8
Merci.
En effet ça fonctionne avec ceci :
initdb -E UNICODE --lc-ctype=en_US.utf8
>psql template1
Welcome to psql 8.0.1, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
template1=# set client_encoding to 'latin9';
SET
template1=# select upper( 'Stéphane' );
upper
----------
STÉPHANE
(1 row)
Mais ce n'est pas sans contrainte. A ce que j'ai pu lire sur le sujet
avoir une locale utf8 (en fait différente de 'C' ou 'POSIX') coûte chère
en performance :
The drawback of using locales other than C or POSIX in PostgreSQL is its
performance impact. It slows character handling and prevents ordinary
indexes from being used by LIKE. For this reason use locales only if you
actually need them.
http://www.postgresql.org/docs/8.0/interactive/charset.html
Un autre problème : Si l'on possède une base avec un encoding différent
de celui utilisé à la création du cluster le comportement sera encore
différent. Pour tester j'ai crée un base test avec un encoding latin9.
Voici le résultat de la même requête que plus haut (client_enconding =
Latin9 également) :
test=# select upper( 'Stéphane' );
upper
----------
STéPHANE
Le 'é' na pas été convertis. En revanche on retrouve le comportement de
PG7.4
Moralité il demeure de grosses différences *fonctionnelles* entre PG7.4
et PG8 qui ne sont pas pour simplifier la vie du DBA devant gérer autre
chose que de l'ASCII dans ses bases.
Stéphane.
From | Date | Subject | |
---|---|---|---|
Next Message | Daniel Verite | 2005-03-05 10:04:55 | Re: invalid multibyte character for locale |
Previous Message | Daniel Verite | 2005-03-04 14:47:39 | Re: invalid multibyte character for locale |