Vous n'êtes pas identifié(e).
Bonjour,
Voilà mon problème : J'ai besoin de faire une requête pour remplir une table sans une base en SQL_ASCII avec des données dans une base en UTF8. Pour cela j'utilise un dblink et ma requête fonctionne très bien mais au final tous mes caractères spéciaux (é, è, ï, ç ...) ne passe pas. J'obtiens des Ã' à la place.
J'aimerais savoir si il y avait un moyen de faire une conversion à la volée entre ces deux formats ?
J'ai déjà essayé de faire SET client_encoding TO 'SQL_ASCII' (ou même d'autres formats) mais ça n'a rien changé.
Merci d'avance,
Cédric
Hors ligne
La base source est SQL_ASCII et la base destination est UTF-8 ou l'inverse ? Peut-tu fournir un script SQL simple qui reproduit le problème ?
Guillaume.
Hors ligne
Ma source est en UTF8 et la destination est en SQL_ASCII.
La requête que j'exécute dans la base en SQL_ASCII est la suivante :
INSERT INTO ma_table
SELECT *
FROM dblink(
'dbname=ma_base host=IP_serveur user=user password= PW',
'ma_requête')
AS req(champ_1 type, champ_2 type, ...)
Comme je l'ai dit dans mon premier post, je n'ai aucun problème lors de l'exécution de la requête. Le problème est dans le résultat.
Par exemple, j'ai "Bourbourées" au lieu de "Bourbourées" ou encore "pizançon" au lieu de "pizançon"
Dernière modification par Cedric V (20/03/2009 10:14:52)
Hors ligne
Je n'arrive pas à reproduire le problème. Quelle version de PostgreSQL utilises-tu ?
D'autre part, utiliser SQL_ASCII comme encodage de base de données est une grosse erreur. Il faut savoir que, pour une base de données en SQL_ASCII, aucune vérification d'encodage ne se fait. Un client du serveur peut envoyer de l'UTF-8 alors qu'il a déclaré travailler en LATIN9, PostgreSQL ne protestera pas et enregistrera des données invalides pour l'encodage supposée. Pourquoi veut-tu utiliser SQL_ASCII ?
Guillaume.
Hors ligne
Je suis sur PostgreSQL 8.2 .
Je sais bien qu'une base en SQL_ASCII n'est pas le top mais je n'ai pas le choix. J'utilise un outil de webmapping propriétaire qui ne fonctionne qu'avec un base encodée avec ce type d'encodage.
Hors ligne
Je n'ai toujours pas le problème en 8.2. Voici mon cas de test complet.
guillaume@laptop$ createdb -E SQL_ASCII cedric
CREATE DATABASE
guillaume@laptop$ createdb -E UTF-8 cedric2
CREATE DATABASE
guillaume@laptop$ psql -l
Liste des bases de données
Nom | Propriétaire | Encodage
-----------+--------------+-----------
[... coupé pour confidentialité (bases clients) ...]
cedric | guillaume | SQL_ASCII
cedric2 | guillaume | UTF8
[... coupé pour confidentialité (bases clients) ...]
(24 lignes)
guillaume@laptop$ psql cedric2
Bienvenue dans psql 8.2.13, l'interface interactive de PostgreSQL.
Saisissez:
\copyright pour les termes de distribution
\h pour l'aide-mémoire des commandes SQL
\? pour l'aide-mémoire des commandes psql
\g ou point-virgule en fin d'instruction pour exécuter la requête
\q pour quitter
cedric2=# create table t1 (id serial, t text);
NOTICE: CREATE TABLE créera des séquences implicites « t1_id_seq » pour la colonne serial « t1.id »
CREATE TABLE
cedric2=# insert into t1 (t) VALUES ('a'), ('à'), ('àéîôü'), ('aeiouàèïôü');
INSERT 0 4
cedric2=# select * from t1;
id | t
----+------------
1 | a
2 | à
3 | àéîôü
4 | aeiouàèïôü
(4 lignes)
cedric2=# \q
guillaume@laptop$ pg_dump cedric2 | psql cedric
SET
SET
SET
SET
SET
COMMENT
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
setval
--------
4
(1 ligne)
ALTER TABLE
REVOKE
REVOKE
GRANT
GRANT
guillaume@laptop$ psql cedric
Bienvenue dans psql 8.2.13, l'interface interactive de PostgreSQL.
Saisissez:
\copyright pour les termes de distribution
\h pour l'aide-mémoire des commandes SQL
\? pour l'aide-mémoire des commandes psql
\g ou point-virgule en fin d'instruction pour exécuter la requête
\q pour quitter
cedric=# select * from t1;
id | t
----+-----------------
1 | a
2 | à
3 | àéîôü
4 | aeiouàèïôü
(4 lignes)
cedric=# show client_encoding;
client_encoding
-----------------
SQL_ASCII
(1 ligne)
cedric=# set client_encoding to utf8;
SET
cedric=# select * from t1;
id | t
----+------------
1 | a
2 | à
3 | àéîôü
4 | aeiouàèïôü
(4 lignes)
cedric=# SELECT *
cedric-# FROM dblink(
cedric(# 'dbname=cedric2 host=localhost',
cedric(# 'SELECT t FROM t1')
cedric-# AS req(t text);
t
-----------------
a
à
àéîôü
aeiouàèïôü
(4 lignes)
cedric=# INSERT INTO t1 (t) SELECT *
FROM dblink(
'dbname=cedric2 host=localhost',
'SELECT t FROM t1')
AS req(t text);
INSERT 0 4
cedric=# select * from t1;
id | t
----+-----------------
1 | a
2 | à
3 | àéîôü
4 | aeiouàèïôü
5 | a
6 | à
7 | àéîôü
8 | aeiouàèïôü
(8 lignes)
Peut-être y trouveras-tu une différence avec ton cas...
Guillaume.
Hors ligne
Je viens de penser à un truc. Le SELECT est fait dans la même session ? ou est-ce ton outil qui le fait ?
Guillaume.
Hors ligne
Tout est fait dans la même session.
J'ai regardé ce que ton code et il me semble que j'ai la même démarche que toi.
Mais j'ai remarqué un truc : j'utilise pg_admin et quand j'affiche les Propriétés de ma base créée en UTF8, il me dit UTF8 (évidemment). Mais quand je fais SHOW client_encoding, là il me dit UNICODE. Par contre si avant je lui fixe l'encodage UTF8 avec SET client_encoding il renvoie bien UTF8.
Le problème peut-il venir de là ou c'est normal ?
Hors ligne
Non, pas à ma connaissance. UTF-8 et Unicode sont la même chose.
Guillaume.
Hors ligne
Merci pour ton aide gleu.
Au final, j'arrive quand même à m'en sortir en remplaçant les caractères qui passent pas par leur valeur correcte. C'est un peu lourd mais ça marche.
Hors ligne