PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 19/03/2009 15:50:09

Cedric V
Membre

Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#2 20/03/2009 01:48:28

gleu
Administrateur

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#3 20/03/2009 10:14:22

Cedric V
Membre

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#4 21/03/2009 01:36:52

gleu
Administrateur

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#5 23/03/2009 10:37:02

Cedric V
Membre

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#6 23/03/2009 15:02:23

gleu
Administrateur

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#7 23/03/2009 15:32:31

gleu
Administrateur

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#8 23/03/2009 19:00:26

Cedric V
Membre

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

#9 23/03/2009 23:55:19

gleu
Administrateur

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

Non, pas à ma connaissance. UTF-8 et Unicode sont la même chose.


Guillaume.

Hors ligne

#10 24/03/2009 13:22:58

Cedric V
Membre

Re : Requête depuis une base en SQL_ASCII dans une base en UTF8

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

Pied de page des forums