Skip site navigation (1) Skip section navigation (2)

Re: Re: création de base en UTF8

From: "Daniel Verite" <daniel(at)manitou-mail(dot)org>
To: "Stephane Bortzmeyer" <bortzmeyer(at)nic(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Re: création de base en UTF8
Date: 2007-11-05 21:25:19
Message-ID: 2a4319ce-b872-4e55-bf06-2b5f7bfec559@mm (view raw or flat)
Thread:
Lists: pgsql-fr-generale
	Stephane Bortzmeyer wrote:

> Mes locales sont toutes en Latin-1, mes bases toutes en UTF-8 et je
> n'ai jamais rencontré de problèmes. Il "suffit" que client_encoding
> soit bien mis.

Ah je ne partage pas cet avis optimiste et j'opposerais à ça un test tout
simple ci-dessous :)

Serveur 8.1 debian etch, initdb --locale=fr_FR.iso88591
Environnement client: fr_FR.iso88591

postgres=# \l
     Liste des bases de données
    Nom    | Propriétaire | Encodage 
-----------+--------------+----------
 postgres  | postgres     | LATIN1
 template0 | postgres     | LATIN1
 template1 | postgres     | LATIN1
(3 lignes)

postgres=# create database u8 encoding 'UTF8';
CREATE DATABASE
postgres=# \c u8
Vous êtes maintenant connecté à la base de données «u8».
postgres=# set client_encoding=latin1;
SET
u8=# select lower('à')
ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a0
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

Or mon client_encoding est tout à fait bon et mon terminal est bien LATIN1.

La raison de cette erreur pour moi est que la fonction lower() est dans un contexte
latin1 à cause de la locale coté serveur.
Elle voit les octets 0xc3,0xa0 (représentation UTF8 du a minuscule accent-grave)
Interprété en latin1, ça donne 2 caractères: A majuscule-tilde suivi de blanc-insécable
Dans ce contexte, le A majuscule-tilde est transformé en a minuscule-tilde (=0xe3) et le
blanc insécable reste tel quel.
Résultat: 0xe3,0xa0. C'est le résultat logique de lower() sur des octets supposés
représenter une chaine en LATIN1.
Problème: ce résultat  n'est pas le même que ce qu'aurait produit lower() en
contexte UTF8, et d'ailleurs il n'est pas même valide du point de vue encodage,
d'où l'erreur générée par PG quand il essaie de le reconvertir en latin1 pour le
renvoyer au client.

-- 
 Daniel
 PostgreSQL-powered mail user agent and storage: http://www.manitou-mail.org

In response to

Responses

pgsql-fr-generale by date

Next:From: Stephane BortzmeyerDate: 2007-11-06 08:45:32
Subject: Re: créatio?==?iso-8859-1?Q?n de base en UTF8
Previous:From: Stephane BortzmeyerDate: 2007-10-31 14:40:20
Subject: Re: créatio?==?iso-8859-1?Q?n de base en UTF8

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group