Vous n'êtes pas identifié(e).
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
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
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
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
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
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
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
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
Marc.
Hors ligne
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