Vous n'êtes pas identifié(e).

#1 22/12/2010 16:41:50

sbouchard
Membre

Interdire les caractères accentués dans les noms de colonne

Bonjour,

J'administre des BD PostgreSQL pédagogiques et j'aimerais paramétrer mon serveur pour que les noms de colonnes avec accent soient refusés. D'une part cela va à l'encontre des bonnes pratiques que j'utilise et d'autre part cela met les backup en erreur ce qui est plus embêtant!

Quelqu'un peut-il me dire comment procéder?

Environnement :
PostgreSQL 8.4.3 sur WindowsServer2008
Client psql sur un poste de travail WindowXP

C:\clientPostgres>chcp
Page de codes active : 1252

test=> show client_encoding;
 client_encoding
-----------------
 win1252
 
test=> show server_encoding;
 server_encoding
-----------------
 UTF8

CREATE TABLE test_accent (
  Nom    VARCHAR(50),
  Prénom VARCHAR(50)
);
CREATE TABLE

test=> \d test_accent
ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a96e
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".

-- Lors du backup avec pg_dump 
...
pg_dump: dumping contents of table test_accent
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a96e
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".
pg_dump: The command was: COPY bouchard.test_accent (nom, "prã©nom") TO stdout;
pg_dump: *** aborted because of error

Par avance merci!

Sylvie

Hors ligne

#2 22/12/2010 16:51:24

Marc Cousin
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Bonjour,

Je ne pense pas que ça soit possible. Il faudrait pour ça des triggers sur les tables systèmes, ce qui n'est pas autorisé.

Pour ce qui est des backups, si cela les met en erreur, utilisez l'option -E de pg_dump, et forcez l'encodage en UTF8 par exemple. Il saura représenter tous les caractères.


Marc.

Hors ligne

#3 22/12/2010 17:43:16

sbouchard
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Merci pour votre réponse.

Malheureusement,  l'indication de l'encodage avec l'option -E ne donne pas le résultat attendu.

Auriez-vous une autre proposition?

C:\postgres\84\bin>pg_dump -i -h localhost -p 5434 -U postgres -E utf8 -F c -f C:\temp\test.backup test

pg_dump: la commande SQL a échoué
pg_dump: Message d'erreur du serveur : ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a96e
ASTUCE : This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
pg_dump: La commande était : COPY bouchard.test_accent (nom, "prã©nom") TO stdout;

Hors ligne

#4 22/12/2010 18:19:05

flo
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Ce n'est probablement pas de l'UTF8 : si vous l'avez créé en ligne de commande sur la console Windows, je pense que c'est du CP1252.
J'ai déjà eu le même souci...
La solution est peut-être d'interdire de créer les tables ainsi  - obliger à passer par pgAdmin, par exemple?

Hors ligne

#5 22/12/2010 18:25:14

Marc Cousin
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Non, c'est un bug de la version windows on dirait. Je suis en train de tester, je n'ai pas le même comportement sous Linux et sous Windows …


Marc.

Hors ligne

#6 22/12/2010 19:02:52

sbouchard
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Pour votre gouverne, il me semble que lorsque j'étais en version 8.3.4 la commande CREATE TABLE (depuis le client psql) avec des caractères accentués dans les noms de colonne provoquait une erreur. De ce fait,  je n'avais pas de problème avec mes backups.

Hors ligne

#7 23/12/2010 11:21:18

flo
Membre

Re : Interdire les caractères accentués dans les noms de colonne

En utilisant un "mauvais" encodage client on peut avoir cette erreur :
postgres=# show client_encoding;
client_encoding
-----------------
utf8
(1 ligne)


postgres=# show server_encoding;
server_encoding
-----------------
UTF8
(1 ligne)


postgres=# CREATE TABLE test_accent (
postgres(#   Nom    VARCHAR(50),
postgres(#   Prénom VARCHAR(50)
postgres(# );
ERREUR:  séquence d'octets invalide pour l'encodage « UTF8 » : 0xe96e6f
postgres=#

Mais ce n'est pas une solution (si un caractère win1252 correspond à un encodage UTF8, ça passera...)

Attendons ce que donnent les tests de Marc...

Hors ligne

#8 23/12/2010 12:01:15

Marc Cousin
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Tous les tests ci-dessous ont été effectués avec un client psql linux (je voulais être sûr que ça ne venait pas du client).

La console est en CP1252 (donc les caractères ci-dessous sont bien affichés en 1252, et saisis en 1252):

Serveur windows (9.0.1):

test=# SET client_encoding TO 'win1252';
SET
test=# CREATE TABLE test (nom varchar, prénom varchar);
CREATE TABLE
test=# \d test
ERREUR:  séquence d'octets invalide pour l'encodage « UTF8 » : 0xe3a96e

Serveur Linux:

marc=# SET client_encoding TO 'win1252';
SET
marc=# CREATE TABLE test (nom varchar, prénom varchar);
CREATE TABLE                                                                                                                                                                                         
marc=# \d test                                                                                                                                                                                       
          Table "public.test"                                                                                                                                                                         
Column |       Type        | Modifiers                                                                                                                                                               
--------+-------------------+-----------                                                                                                                                                             
nom    | character varying |                                                                                                                                                                         
prénom | character varying |         

Sur le client linux, si on repasse la console ET le client_encoding à UTF8, les caractères accentués s'affichent parfaitement aussi.

On dirait donc un bug sur la version Windows. Je vais me renseigner et je vous tiens au courant smile


Marc.

Hors ligne

#9 23/12/2010 17:52:47

sbouchard
Membre

Re : Interdire les caractères accentués dans les noms de colonne

Merci pour les tests effectués et n'oubliez pas de prendre un peu de vacances!

En attendant des nouvelles je vous souhaite un Joyeux Noël!

Sylvie

Hors ligne

Pied de page des forums