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 22/09/2010 11:13:00

unisol
Membre

modifier le codage d'une base de données

Bonjour,
comment modifier le codage d'une base de données ?

ma base actuelle est codé en LATIN1 et me pose des problemes que je ne rencontre pas
avec un autre serveur qui possede la meme base mais codé en UTF8,

pouvez vous m'aider s'il vous plait .

Merci d'avance.

Hors ligne

#2 22/09/2010 11:18:53

Marc Cousin
Membre

Re : modifier le codage d'une base de données

On ne peut pas le modifier. On peut recréer une base ou un cluster dans le nouvel encodage, mais on ne peut pas modifier celui d'une base déjà créée.

Il vous faut donc exporter cette base, en créer une nouvelle, et réimporter dedans


Marc.

Hors ligne

#3 22/09/2010 14:21:40

arthurr
Membre

Re : modifier le codage d'une base de données

tu peux faire une sauvegarde de ta base qui est en LATIN1 vers UTF8 comme ca :
pg_dump -Fc -f tabase.dump --encoding='UTF8' TABASE

Apres tu dois pouvoir restorer en UTF8 sans probleme.

Hors ligne

#4 22/09/2010 14:31:37

Marc Cousin
Membre

Re : modifier le codage d'une base de données

Ce n'est même pas nécessaire. Le dump indique son encodage. Si on restaure un dump latin1 dans une base utf8, postgresql fait la conversion tout seul.


Marc.

Hors ligne

#5 27/09/2010 18:46:28

jhashe
Membre

Re : modifier le codage d'une base de données

Bonjour,

Je souhaitais profiter de la migration vers PostgreSQL 9.0 pour (enfin !) utiliser le module unaccent.
Or, malheureusement, pour des raisons "historiques", le codage actuel de ma base est SQL_ASCII. Les commandes unaccent ne fonctionnent donc pas dessus, ce que je peux comprendre.
J'ai  donc tenté de créer une base en UTF8, mais je n'arrive pas y importer mon dump (j'obtiens une suite d'erreurs du style: ERREUR:  séquence d'octets invalide pour l'encodage « UTF8 » : 0xe96e6f
CONTEXTE : COPY log_user_backup, ligne 12)

J'ai tenté à partir d'un dump "simple" (pg_dump mabase) et avec la commande suggérée ci-dessus (pg_dump -Fc -f tabase.dump --encoding='UTF8' TABASE), mais rien n'y fait; j'ai toujours la même erreur.

A priori, l'encode actuel de ma base serait ISO-8859-1 (généré essentiellmement à partir de clients Windows), mais si j'essaye de créer une base avec ce type d'encodage, createdb me génère une erreur: l'encodage ISO_8859_5 ne correspond pas à la locale fr_FR.UTF-8. Le paramètre LC_CTYPE choisi nécessite l'encodage UTF8.

Mon cas est-il désespéré ?

Par avance, merci pour votre aide

Hors ligne

#6 27/09/2010 18:53:25

gleu
Administrateur

Re : modifier le codage d'une base de données

Vous devez créer votre base à partir de template0, et non pas à partir de template1.


Guillaume.

Hors ligne

#7 28/09/2010 09:01:28

jhashe
Membre

Re : modifier le codage d'une base de données

J'ai déjà essayé.
Exemple:
CREATE DATABASE mabase
  WITH ENCODING='ISO_8859_5'
       TEMPLATE=template0

Erreur: ERREUR:  l'encodage ISO_8859_5 ne correspond pas à la locale fr_FR.UTF-8
DETAIL:  Le paramètre LC_CTYPE choisi nécessite l'encodage UTF8.

Si j'en crois pgAdmin, pour Collation, j'ai le choix entre C, fr_FT.UTF8 et POSIX. Malheureusement,quelque soit le type choisi parmi ces 3, j'ai toujours la même erreur.

Hors ligne

#8 28/09/2010 09:13:04

Marc Cousin
Membre

Re : modifier le codage d'une base de données

Bonjour,

ISO_8859_5 est l'alphabet cyrillique. Vous êtes sûr que c'est ce que vous voulez ?

Sinon, il faut aussi préciser un ordre de collation compatible avec l'encoding ('ru_RU' vraisemblablement).


Marc.

Hors ligne

#9 28/09/2010 10:16:52

jhashe
Membre

Re : modifier le codage d'une base de données

Excusez-moi, vous avez raison. Le charset était mauvais.
Mon serveur WEB utilise actuellement iso-8859-1

J'ai réussi à intégrer mon dump, après l'avoir converti "à la main" en UTF8, comme ceci:
iconv -f WINDOWS-1252  -t UTF-8 -o megalis5.sql ../postgresql/megalis_last.sql

Mais, bien évidemment, l'affichage des caractères accentués devient incohérent.

Mon souhait serait donc de créer une base en définissant explicitement ce charset.

Hors ligne

#10 28/09/2010 10:19:24

jhashe
Membre

Re : modifier le codage d'une base de données

Je me réponds à moi-même ;-)
Je pense avoir réussi, en exécutant la commande suivante:

CREATE DATABASE MaBase
  WITH OWNER = postgres
       ENCODING = 'ISO_8859_1'
       TABLESPACE = pg_default
       TEMPLATE template0
       LC_COLLATE = 'POSIX'
       LC_CTYPE = 'POSIX'
       CONNECTION LIMIT = -1;

En espérant que cette information puisse être utile à d'autres.

Et merci pour votre aide, toujours aussi précieuse et avisée

Dernière modification par jhashe (28/09/2010 10:20:08)

Hors ligne

#11 28/09/2010 10:35:18

Marc Cousin
Membre

Re : modifier le codage d'une base de données

Ce n'est pas tout à fait bon:

CREATE DATABASE MaBase
  WITH OWNER = postgres
       ENCODING = 'ISO_8859_1'
       TABLESPACE = pg_default
       TEMPLATE template0
       LC_COLLATE = 'fr_FR'
       LC_CTYPE = 'fr_FR'
       CONNECTION LIMIT = -1;

C'est important. Surtout si vous tenez à ce que les données soient triées par ordre alphabétique français.

Par ailleurs, le iconv est totalement inutile.

Si la base initiale est SQL_ASCII, mais que vous êtres sûr qu'elle est encodée en LATIN1 (iso-8859-1), LATIN9 (iso8859-15), ou WIN1252 (WINDOWS-1252), il suffit de positionner client_encoding correctement dans la session avant de lancer l'import.

Ensuite, méfiez vous, vous êtes en train de confondre plusieurs encodages différents : LATIN1 et WIN1252 ne sont pas strictement identiques.


Marc.

Hors ligne

#12 28/09/2010 11:07:04

jhashe
Membre

Re : modifier le codage d'une base de données

Merci pour votre réponse.
Il est vrai qu'en ce qui concerne l'encodage des caractères, je suis un peu perplexe.

Certaines données sont alimentées à partir de clients lourds sous Windows (ce qui me ferait pencher pour du WINDOWS-1252), alors que d'autres sont alimentées par divers sites WEB (iso-8859-1). Mais cela n'avait jamais posé de problème jusque là.

Par contre, j'ai un soucis avec la commande SQL que vous suggérez. Lorsque je la tape, j'obtiens le message d'erreur suivant:

nom de locale 'fr_FR' invalide.

Or, vous avez raison, l'impact sur l'ordre des tris est pourtant particulièrement important.

Mais, mon problème principal provient de la contribution unaccent. Rien ne semble préciser dans la documentation qu'elle ne fonctionne qu'en UTF-8. Or cela semble malheureusement pourtant être le cas. Dans une situation comme la nôtre, où la base est en place depuis des années, est alimentée par de nombreux programmes (des clients lourds, des intranets, des sites web,...), changer le type d'encodage est quasi-impossible (il faudrait modifier tous les process "en même temps", et je ne suis même pas sûr que nous possédions les sources pour chacun d'entre eux).

Ma plus grosse attente concernant la version 9.0 de PostgreSQL concernait pourtant bien ce point fondamental (voir les nombreux messages que j'avais envoyés sur ce même forum). Nous avons en effet commencé à développer des interfaces exploitant T-Search, mais les usages en France font que les internautes "zappent" fréquemment les accents. D'ailleurs, qui accentue correctement les majuscules ? Sans unaccent, le résultat est insatisfaisant (par exemple, je recherche hôtel, mais je ne retrouve pas un article dont le titre est HOTEL DE LA MER, compréhensible d'un point de vue SGBD, mais aberrant d'un point de vue utilisateur)

On peut certes "bidouiller" en stockant une copie (ou mieux, directement le vecteur) du champ sans les accents, mais cela pose d'autres problèmes, notamment le ts_headline  utilisé pour afficher des extraits de résultats. En effet, un extrait privé de ces accents est inacceptable pour nos utilisateurs.

J'essaye de me battre avec des convert_to, encode et autres manipulations, mais sans succès.

Bref, mes premières tentatives génèrent quelques frustrations (et c'est peu dire...)

Hors ligne

#13 28/09/2010 11:47:01

Marc Cousin
Membre

Re : modifier le codage d'une base de données

Nom de locale fr_FR invalide ?

Quel est le système d'exploitation ?

Si c'est linux, que répond locale -a ?

Pour ce qui est de la suite, vous avez intérêt à avoir votre base en UTF8, et positionner le client_encoding correctement sur tous les clients. Ainsi, PostgreSQL s'occupera de la conversion, et enverra les données dans le bon encodage aux clients, tout en ayant la possibilité de tout stocker.


Marc.

Hors ligne

#14 28/09/2010 12:44:53

jhashe
Membre

Re : modifier le codage d'une base de données

Je suis sous Debian Lenny (avec un petit bout de sid pour Postgresql-9.0)
locale -a répond:
C
fr_FR.utf8
POSIX

J'ai tenté un:
create database megalis6 with owner=postgres encoding='LATIN1' tablespace=pg_default TEMPLATE template0 LC_COLLATE='fr_FR.utf8' LC_CTYPE='fr_FR.utf8';

mais j'obtiens une nouvelle erreur:

l'encodage LATIN1 ne correspond pas à la locale fr_FR.utf8
Le paramètre LC_CTYPE choisi nécessite l'encodage UTF8.

Mais votre dernier message suggère une piste plus intéressante, à savoir le "client encoding"

Les clients lourds utilisent ODBC pour accéder à PostgreSQL. Ce paramètre se configure-t-il dans la zone "Connect Settings" du driver ODBC ? (je ne vois pas d'autre endroit possible). Que faut-il y renseigner ?

De même, nos outils WEB sont développés en PHP, et utilisent la couche d'abstraction ADODB.

Savez-vous ou positionner ce paramètre ?
A titre d'exemple, voici un extrait de la connexion actuelle:


        $MM_mabase_HOSTNAME = "192.168.10.199";
        $MM_mabase_DATABASE = "postgres7:mabase";
        $MM_mabase_DBTYPE   = preg_replace("/:.*$/", "", $MM_mabase_DATABASE);
        $MM_mabase_DATABASE = preg_replace("/^.*?:/", "", $MM_mabase_DATABASE);
        $MM_mabase_USERNAME = "postgres";
        $MM_mabase_PASSWORD = "MonMotPasse";
        $MM_mabase_LOCALE = "Fr";
        $MM_mabase_MSGLOCALE = "Fr";
        $MM_mabase_CTYPE = "P";
        $KT_locale = $MM_mabase_MSGLOCALE;
        $KT_dlocale = $MM_mabase_LOCALE;
        $KT_serverFormat = "%Y-%m-%d %H:%M:%S";
        $QUB_Caching = "false";

Hors ligne

#15 28/09/2010 13:08:46

Marc Cousin
Membre

Re : modifier le codage d'une base de données

Bonjour,

Le problème, c'est que vous n'avez pas la locale correspondant à fr_FR et LATIN1 (son nom c'est fr_FR)

essayez dpkg-reconfigure -plow locales

Il devrait vous redemaner la liste de locales à générer. Vous pourrez ensuite les utiliser.

Pour ce qui est du paramétrage ODBC aucune idée de comment on y règle l'encodage. Je pense qu'il met la bonne valeur tout seul. Vu que jusque là vous étiez paramétré en 'ASCII' au niveau de la base, il n'y avait aucun transcodage entre le client et le serveur.


Marc.

Hors ligne

#16 01/10/2010 11:14:11

jhashe
Membre

Re : modifier le codage d'une base de données

Bonjour,

Le paramètre "client encoding" fonctionne effectivement très bien :-)
Sous Windows, pour le fixer, quand on crée la connexion ODBC, il faut cliquer sur le bouton Datasource, puis sur la page 2, dans la zone Connect Setting, il suffit de rajouter SET CLIENT_ENCODING TO 'WIN1252';

En PHP, avec ADODB, après l'établissement de la connexion, il faut ajouter la ligne suivante:
$maSource->SetCharSet("WIN1252");

Bref, l'horizon s'éclaircit.

Merci pour votre aide !

Hors ligne

#17 09/10/2010 13:57:25

unisol
Membre

Re : modifier le codage d'une base de données

Bonjour,
apres quelques jour d'absence...
en fait le serveur ne voulait pas d'UTF8 du tout.
donc solution radicale :

reinstallation de postgres;
puis importation des données dans une base en utf8

merci pour votre collaboration à tous!

Hors ligne

Pied de page des forums