|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
bonjour à tous,
voilà, j'essaie de créer ma première base de données sous postgresql, et j'ai malheureusement obtenu une erreur. Code :
j'aimerais savoir ce que je dois faire pour pouvoir encode en LATIN1 sans risquer de détériorer ma configuration svp merci ! |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 950 ![]() |
La collation d'une base dépend du jeu de caractères sous-jacent. Linux est en général assez pauvre en matière de jeux de caractères ce qui fait que le choix de la collation est restreint.
Lisez ceci : http://www.developpez.net/forums/d77...nger-lc_ctype/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 | |
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
merci pour le lien, je viens de lire ce topic.
mais la solution apportée à mon problème concerne postgresql sous windows : Citation:
je vais voir si je peux installer de nouveaux jeux de caractères. je crois que ça dois être possible dans la logithèque. |
|
|
|
00
|
|
|
#4 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonjour
Au shell avant d'initialiser le moteur Tapez la commande en root (locale) vous trouverez des valeurs sur UTF8 copiez et collez les commandes suivantes au shell export LANG="C" export LC_CTYPE="C" export LC_NUMERIC="C" export LC_TIME="C" export LC_COLLATE="C" export LC_MONETARY="C" export LC_MESSAGES="C" export LC_PAPER="C" export LC_NAME="C" export LC_ADDRESS="C" export LC_TELEPHONE="C" export LC_MEASUREMENT="C" export LC_IDENTIFICATION="C" export LC_ALL="C" locale pour vérifier les nouvelles valeurs initialiser le moteur une fois ces valeurs instruites (su postgres) initdb -D /home/mabase etc .... Cordialement |
|
|
00
|
|
|
#5 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Citation:
Code :
CREATE DATABASE truc encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0 L'inconvénient est qu'en cas de besoin d'une collation française, notamment pour trier avec les règles françaises, la locale 'C' ne remplit pas cette fonction. Si c'est effectivement un problème, il faut que tu détermines quelle est la locale qui convient à ta base avant tout autre chose. Ensuite il faut que tu l'installes sur ton système ubuntu si elle n'y est pas déjà. |
|
|
|
00
|
|
|
#6 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonsoir
Cette solution est supposée fonctionner directement sans autre manipulation. Oui ... mais ...Le problème c'est que cela ne fonctionne plus avec les 9.+ si initdb n'est pas exécuté en (LC_) 'C'. (.........la locale 'C' ne remplit pas cette fonction.) Non pas exactement .... Si votre moteur est initialisé "C" , vous avez par la suite la possibilité de créer plusieurs bases sous différents (encodages) (9.+) Il suffit d'aligner les paramètres de chaque base via leurs fichiers (postgresl.conf) respectifs. (plusieurs instances) Vous avez du Latin et de Utf8 ou autres possible via un moteur unique. Je pense que pour les bases en sous-instances avec 'C' une pluralité d'encodages doit être gérée dans la commande de création Je vais faire le test si j'ai un moteur 9 sous la main... SQLpro. Je ne vois pas de lien avec une pseudo pauvreté de fontes Linux ??? En mode UTF8 certains caractères ne sont pas gérés correctement par Postgresql Linux n'est pas en cause. Cordialement |
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
|
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
merci beaucoup pour vos réponses !
je viens d'avoir l'avis d'un ami qui s'y connait beaucoup en bases de données. selon lui, le format d'encodage utf8 est le plus évolué à l'heure actuelle. aussi me conseille-t'il de l'utiliser plutôt que le Latin1. je vais donc garder ce format d'encodage. je considère donc que ce post est résolu ! ![]() encore merci ! |
|
|
00
|
|
|
#9 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonsoir
estofilo Pourquoi ça ne fonctionnerait pas en 9.0? Un peu surpris comme vous , j'ai rencontré le problème il y a un moment déjà en travaillant sur les versions 9 en version bêta. J'ai une 9.03 supposée finalisée sur une machine Debian Squeeze 6, je vais refaire un test.. thor76160 Si vous pouvez fournir votre développement avec notre langue tronquée; sans les caractères accentués , vous en avez de la chance.... Si vous envisagez de faire communiquer la base avec une interface 80 (web) vous allez rencontrer des problèmes plus sérieux... ( l'ampersand &) et le ; qui est rejeté dans le nominatif champs.La taille native maximum pour les champs est également trop courte avec l'encodage utf8... L'utf8 pour nous Latins engendre un nombre de problèmes considérable. Par exemple,un utilisateur (Latin) distant, sur un navigateur, va probablement, lui ,saisir correctement avec les caractères accentués, le problème votre utf8 ne va pas renseigner une correspondance distinct mais toujours un même code unique de non gestion.. Le problème est encore plus sérieux avec les claviers virtuels qui peuvent gérer plusieurs encodages dynamiquement dans un même saisie... Regardez l'encodage par défaut utilisé par votre navigateur, vous allez être surpris. Cordialement |
|
|
00
|
|
|
#10 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonjour
Thor76160 Vous pouvez traiter les problèmes partialement avec certaines fonctions spécifiques de Postgresql mais sachez qu'il n'y a pas d'instructions CREATE CONVERSION,ALTER CONVERSION,DROP CONVERSION dans le standard SQL. Je vous conseille fortement d'adopter Latin1 via la syntaxe proposée par estofilo qui est probablement parfaitement compatible avec votre version.et peut être également avec les 9.x je vais vérifier.. ce n'est pas si simple car il y a un encodage natif du système a l'installation. Quand vous lancez un serveur X le clavier est ré-encodé (cela vous donne les accents(xterm, rxvt etc...) via un serveur natif utf8). Contrairement a Lenny 5 avec Debian 6 Squeeze ,en mode installation (initiés) à une des étapes sélectives de l'encodage vous n'avez pas d'autres choix possibles que valider UTF8-FR. ??? J'espère que cela ne va pas créer un nouveau problème avec Pg... Remarque: (Ubuntu est fondée sur un base Debian). Estofilo,je lis bien comme vous Page 397 la documentation Pg 9.03 (en PDF) Important Sur la plupart des systèmes d'exploitation modernes, PostgreSQLTM peut déterminer le jeu de caractères impliqué par la variable LC_CTYPE, et s'assure que l'encodage correspondant de la base de données est utilisé. Sur les systèmes plus anciens, il est de la responsabilité de l'utilisateur de s'assurer que l'encodage attendu par la locale est bien utilisé. Une erreur à ce niveau risque fort de conduire à un comportement étrange des opérations liées à la locale, tel le tri. PostgreSQLTM autorise les superutilisateurs à créer des bases de données avec le jeu de caractère SQL_ASCII même lorsque la variable LC_CTYPE n'est pas à C ou POSIX. Comme indiqué plus haut, SQL_ASCII n'impose aucun encodage particulier aux données stockées en base, ce qui rend ce paramétrage vulnérable aux comporte- ments erratiques lors d'opérations liées à la locale. Cette combinaison de paramètres est dépréciée et pourrait un jour être interdite. Mais le résultat en 9.03 est bien le suivant.... postgres-# CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; ERROR: syntax error at or near "CREATE" at character 88 STATEMENT: CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0 CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0 CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; ERROR: syntax error at or near "CREATE" LINE 2: CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ct... ^ Variante avec " postgres=# CREATE DATABASE base encoding="LATIN1" lc_collate="C" lc_ctype="C" template=template0; ERROR: syntax error at or near ""LATIN1"" at character 32 STATEMENT: CREATE DATABASE base encoding="LATIN1" lc_collate="C" lc_ctype="C" template=template0; ERROR: syntax error at or near ""LATIN1"" LINE 1: CREATE DATABASE base encoding="LATIN1" lc_collate="C" lc_ct... Variante directement à partir du répertoire moteur postgres@debian-ppc:/usr/local/pgsql/bin$ ./createdb base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; createdb: too many command-line arguments (first is "lc_collate=C") Try "createdb --help" for more information. Je pense que dans le contexte de la (doc) ,votre terminal shell utilisateur profilé est supposé ascii (via un .bash ou un .profile) mais ce n'est pas le cas par défaut avec une installation en utf8.. ??? Encore la commande sous une autre forme pour avoir la bonne erreur. postgres@debian-ppc:/usr/local/pgsql/bin$ ./createdb -E latin1 base ERROR: encoding LATIN1 does not match locale fr_FR.UTF-8 DETAIL: The chosen LC_CTYPE setting requires encoding UTF8. STATEMENT: CREATE DATABASE base ENCODING 'latin1'; createdb: database creation failed: ERROR: encoding LATIN1 does not match locale fr_FR.UTF-8 DETAIL: The chosen LC_CTYPE setting requires encoding UTF8. Par defaut dans le terminal locale me donne LANG=fr_FR.UTF-8 LC_CTYPE="fr_FR.UTF-8" LC_NUMERIC="fr_FR.UTF-8" LC_TIME="fr_FR.UTF-8" LC_COLLATE="fr_FR.UTF-8" LC_MONETARY="fr_FR.UTF-8" LC_MESSAGES="fr_FR.UTF-8" LC_PAPER="fr_FR.UTF-8" LC_NAME="fr_FR.UTF-8" LC_ADDRESS="fr_FR.UTF-8" LC_TELEPHONE="fr_FR.UTF-8" LC_MEASUREMENT="fr_FR.UTF-8" LC_IDENTIFICATION="fr_FR.UTF-8" LC_ALL= Donc export LANG=UTF8 local donne: LANG=UTF8 LC_CTYPE="UTF8" LC_NUMERIC="UTF8" LC_TIME="UTF8" LC_COLLATE="UTF8" LC_MONETARY="UTF8" LC_MESSAGES="UTF8" LC_PAPER="UTF8" LC_NAME="UTF8" LC_ADDRESS="UTF8" LC_TELEPHONE="UTF8" LC_MEASUREMENT="UTF8" LC_IDENTIFICATION="UTF8" LC_ALL=UTF8 postgres=# CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; CREATE DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- base postgres | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | template0 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) Pas besoin d'initialiser obligatoirement le moteur 'C' , mais je vais vérifier que le backend C /C++ reçoit bien du moteur les données appelées correctes avec les accents.... Cordialement |
|
|
00
|
|
|
#11 | |||
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
Merci Bustaf, je vais essayer votre méthode !
je vais essayer cette démarche : Citation:
ensuite j'utiliserais cette ligne : Code :
|
|||
|
|
00
|
|
|
#12 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonjour
Thor76160, Le (Merci) on le doit à Estofilo le problème vient tout simplement des valeurs potentielles initialisées dans le terminal le fr_FR.UTF-8 (il ne connaît pas....) le \l est simplement la commande pour lister les bases quand vous êtes dans le shell (psql) Essayez de vous renseigner via un utilisateur Ubuntu initié Mon installation est différente de la votre elle est originaire d'une compilation des sources. Vous utilisez probablement un (package) binaire Ubuntu qui est installé sur des chemins (path) spécifiques. Je peux vous aider d'une (façon prompt possible) uniquement si vous partez d'une compilation personnalisée des sources ,similaire. Cordialement |
|
|
00
|
|
|
#13 |
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
ah, dans ce cas merci Estofilo !
je vais me renseigner, je reviendrais quand j'aurais de nouvelles infos.
|
|
|
00
|
|
|
#14 | |
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
j'ai fais un 'locale -a' dans mon terminal, voilà ce que j'ai obtenu :
Citation:
|
|
|
|
00
|
|
|
#15 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonjour
(Avec une installation (allégée...)) root@debian-ppc:/download/postgresql-9.0.3# locale -a C fr_FR.utf8 POSIX C'est n'est pas relationnel avec le problème Postgresql ... Vous avez ce panel avec le serveur xorg pour plusieurs utilisateurs (desktop) éventuels via des entrées (xdm etc...) ou pour les TTY texte session ALT F2... etc ... C'est Postgresql qui ne reconnaît pas ces formes déclarées. Il attend (UTF8) disponible via la commande: export LANG=UTF8 Cordialement |
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
j'ai bien lancé cette ligne de commande mais elle semble ne provoquer aucun changement :/
|
|
|
00
|
|
|
#17 |
|
Membre habitué
![]() Inscription : décembre 2007 Messages : 579 ![]() |
ok alors j'ai du nouveau !
le export Lang=utf8 fonctionne, il change la locale. seulement, une création de base de données en latin1 via phppgadmin génère l'erreur habituelle. il faut impérativement passer par le terminal : Code :
CREATE DATABASE base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; j'aurais préféré que ce soit correctement géré par phppgadmin, mais tant pis.je mets le sujet en résolu. merci beaucoup ! |
|
|
00
|
|
|
#18 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonsoir
Suivez ce déroulement avec vos path alignés pour répondre exactement à ce que vous attendez. mkdir /home/pgsql chown -R postgres /home/pgsql chmod -R 0700 /home/pgsql su postgres postgres@debian-ppc:/usr/local/pgsql/bin$ export LANG=C postgres@debian-ppc:/usr/local/pgsql/bin$ locale LANG=C LC_CTYPE="C" LC_NUMERIC="C" LC_TIME="C" LC_COLLATE="C" LC_MONETARY="C" LC_MESSAGES="C" LC_PAPER="C" LC_NAME="C" LC_ADDRESS="C" LC_TELEPHONE="C" LC_MEASUREMENT="C" LC_IDENTIFICATION="C" LC_ALL= postgres@debian-ppc:/usr/local/pgsql/bin$ ./initdb -D /home/pgsql The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale C. The default database encoding has accordingly been set to SQL_ASCII. The default text search configuration will be set to "english". fixing permissions on existing directory /home/pgsql ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 28MB creating configuration files ... ok creating template1 database in /home/pgsql/base/1 ... ok initializing pg_authid ... ok initializing dependencies ... ok creating system views ... ok loading system objects' descriptions ... ok creating conversions ... ok creating dictionaries ... ok setting privileges on built-in objects ... ok creating information schema ... ok loading PL/pgSQL server-side language ... ok vacuuming database template1 ... ok copying template1 to template0 ... ok copying template1 to postgres ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the -A option the next time you run initdb. Success. You can now start the database server using: ./postgres -D /home/pgsql or ./pg_ctl -D /home/pgsql -l logfile start /usr/local/pgsql/bin/pg_ctl -D /home/pgsql start postgres@debian-ppc:/usr/local/pgsql/bin$ ./psql psql (9.0.3) Type "help" for help. postgres=# create database base; CREATE DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+-----------+-----------+-------+----------------------- base | postgres | SQL_ASCII | C | C | postgres | postgres | SQL_ASCII | C | C | template0 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) postgres=# CREATE DATABASE base1 encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; CREATE DATABASE postgres=# CREATE DATABASE base2 encoding='UTF8' lc_collate='C' lc_ctype='C' template=template0; CREATE DATABASE postgres=# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+-----------+-----------+-------+----------------------- base | postgres | SQL_ASCII | C | C | base1 | postgres | LATIN1 | C | C | base2 | postgres | UTF8 | C | C | postgres | postgres | SQL_ASCII | C | C | template0 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (6 rows) Si le moteur est initialisé avec "C" les bases crées sans spécifications sont ascii par défaut Un point d'entrée incorrectement encodé pour Postgresql n'a aucune incidence de plus vous pouvez creer sur d'autres encodages sans problème. Ma première réponse était donc la plus judicieuse pour vous... Bon courage .... (thor76160, j'ai trop de (TAF) pour poursuivre l'échange dans l'immédiat) ![]() Cordialement. |
|
|
00
|
|
|
#19 | |||
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#20 |
|
Inactif
![]() Inscription : novembre 2004 Messages : 247 ![]() |
Bonsoir
le -# n'est pas en rapport je pense ... ???? postgres@debian-ppc:/usr/local/pgsql/bin$ ./pgsql bash: ./pgsql: Aucun fichier ou dossier de ce type postgres@debian-ppc:/usr/local/pgsql/bin$ ./psql psql (9.0.3) Type "help" for help. postgres=# ls (factice ça fait le -# ) postgres-# postgres-# postgres-# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- base1 | postgres | LATIN1 | C | C | base2 | postgres | LATIN1 | C | C | postgres | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | template0 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (5 rows) postgres-# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- base1 | postgres | LATIN1 | C | C | base2 | postgres | LATIN1 | C | C | postgres | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | template0 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (5 rows) postgres-# postgres-# ^C (control c pour avoir de nouveau le =#) postgres=# je vais chercher dans la doc le fonctionnement précis de ce truc ou lire les sources concernés .. (ça ne pas être une faute de frappe il est avant la focus curseur disponible.) pourquoi thor76160 a aussi l'erreur ?? Je remarque quand il y a quelque chose avant, une erreur le mentionne. mais pas avec une instruction interne ... postgres=# ls postgres-# postgres-# postgres-# postgres-# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- base1 | postgres | LATIN1 | C | C | base2 | postgres | LATIN1 | C | C | postgres | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | template0 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | fr_FR.UTF-8 | fr_FR.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (5 rows) postgres-# postgres@debian-ppc:/usr/local/pgsql/bin$ ./createdb base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; ERROR: syntax error at or near "ls" at character 1 STATEMENT: ls postgres@debian-ppc:/usr/local/pgsql/bin$ ./createdb base encoding='LATIN1' lc_collate='C' lc_ctype='C' template=template0; ERROR: syntax error at or near "ls" LINE 1: ls ^ postgres=# createdb: too many command-line arguments (first is "lc_collate=C") postgres-# Try "createdb --help" for more information. postgres-# Moi j'ai: postgres=# show lc_ctype; lc_ctype ------------- fr_FR.UTF-8 (1 row) ?????? cette différence ![]() /usr/local/pgsql/bin$ ./createdb -E latin1 base Là directement par le shell du système ,il n'y a pas de buffer (readline) supposé -# et l'erreur d'encodage est dénoncée clairement. Je vais essayer avec un I7-950 en O/S (AMD64) je suis actuellement sur une machine RS/6000 Squeeze Debian en PPC.... De plus je ne référence pas un système courant j'ai recompilé presque la moité de la distribution avec l'espoir d'accélérer un peu cette vielle machine... Je finis une nouvelle compilation de GCC en 4.5.2 ,je recompile les sources PG sur du ext4 (je suis sur une partition en btrfs ) et je réessaye quand même sur cette vielle machine,je veux comprendre clairement ce problème d'encodage. Cordialement |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com