RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Srv: irc.moteurprog.com
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 Caractère spéciaux dans les requêtes SQL

Forum : PERL
Sous Catégorie : Aucune
Type du sujet : Sujet Normale
FAQ : FAQ PERL

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET NON RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ N'APPARTIENT PAS A LA FAQ


PAGE : [1]

POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM PERL

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
Visiteur MP
Membre du club
Inscrit :
Messages : 1255
Message
#151978
Posté le 16/04/08 à 13:22
Bonjour,
voila j'essaie de monter un wiki avec XWiki et j'ai récupéré un tableau de définition à intégrer dans le wiki.
J'ai réussi à créer avec perl la liste des champs à insérer dans la table mais dans les définition il y a souvent des caractères spéciaux tels que é, à, ' ou €.
J'ai réussi afficher les côtes en les doublant et les accents en encodant en UTF-8 (ma table est en latin1 donc je fais un "SET NAMES 'UTF8'" ). Mais pour le € il refuse les requête.

voila un exemple de requête refusée :


use DBI; use CGI; use Encode::Encoder qw(encoder); $co = new CGI; print $co->header; $database="test"; $hostname="localhost"; $login = "root"; $mdp = "xxxx"; $dsn = "DBI:mysqlPP:database=$database;host=$hostname;port=3308"; $dbh = DBI->connect($dsn, $login, $mdp) or die "Echec connexion"; $query = "SET NAMES 'UTF8'"; $sth1 = $dbh->prepare($query); $sth1->execute(); $sth1 -> finish; $chaine = "80536434, 'Lexique.Arbitrage', 'Arbitrage', 'Arbitrage', '', 'fr', 0, '2008-04-15 18:48:14', '2008-04-15 18:48:14', '2008-04-15 18:48:14', 'XWiki.Root', 'XWiki.Root', 'XWiki.Root', 'Lexique', '1 Arbitrage Changer le FCPE choisi pour son épargne est possible suivant l''évolution du marché mobilier. Par exemple : quitter un FCPE exposé pour un FCPE équilibré ou l''inverse. Les frais de transfert sont de 2 € par opération. Source : [Glossaire Systalians>http://10.67.92.110:8080/xwiki/bin/download/Lexique/WebHome/GlossaireSystalians.xls]', '1.1', '', 'WebHome', '', 2, '', '', '', b'0'"; $chaine = Encode::encode("utf8", $chaine); $requete = "INSERT INTO xwikidoc VALUES(".$chaine.")"; $sth = $dbh->prepare($requete); $sth->execute(); $sth -> finish; $dbh -> disconnect;



et voila l'erreur levée :

Aucun dit :
DBD::mysqlPP::st execute failed: #HY000Incorrect string value: '\xC2\x80 par...'
for column 'XWD_CONTENT' at row 1 at test_sql.pl line 31.


Ma config :
Windows 2003 Server
MySQL Server 5.0
ActivePerl 5.10

Si quelqu'un à une solution je suis preneur.

Merci d'avance.

Thundara

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

hibou57
Rédacteur MP
Superviseur :
- Langages Web
Modérateur :
- XML/XSL
- ADA
Avatar de hibou57
Inscrit : 13/02/2005
Messages : 560
Message
#151984
Posté le 16/04/08 à 14:29
Parce que le symbole de l'EURO n'est pas Latin-1.

Parce que Latin-1, c'est l'ISO-8859-1, et que ce jeux de caractères ne contient pas le symbole EURO. On crois souvent à tord que c'est du Latin-1, parce que le symbole EURO est inclus dans la page de code Windows-1252, que l'on utilise souvent comme si c'était du Latin-1.... mais Windows-1252, ça, c'est "Latin-Windows" celle-là Smiley

Ca n'est d'ailleurs même pas dans l'ISO-8859-2, mais dans l'ISO-8859-15 (Latin9), qui est la version Latin-X spécialement faite pour intégrer le symbole EURO.

Le mieux est quand-même encore d'avoir une base entièrement en UTF-8... qui est quand-même THE universal encoding Smiley (par abus de langage, je sais...)
__________________________
Lasidoré : Editeur XML orienté sémantique/Online XML editor - Alpha
Utiliser le Compilateur Ada GNAT - Fiabilité professionnelle, Ada we trust
Opera, Le navigateur - Léger, rapide, efficace, joli et source d'inspiration
DragonFly, Le debugger JavaScript, CSS, ... et HTML - Only on Opera
Exalead Search - Beceause Google is not a synonym of “ search engine ”

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

Visiteur MP
Membre du club
Inscrit :
Messages : 1255
Message
#151992
Posté le 16/04/08 à 16:06
J'ai passé toutes mes tables et MySQL en utf8 et j'ai enlevé ce bout de code:


$query = "SET NAMES 'UTF8'"; $sth1 = $dbh->prepare($query); $sth1->execute(); $sth1 -> finish;


mais il me met toujours la même erreur.

Quand je choisis le characterset il y a 2 champs :

Charset : utf8
Collation : utf8_general_ci

est-ce le bon Collation ?

PS : j'utilise MySQL Query Browser pour changer le characterset de mes table

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

hibou57
Rédacteur MP
Superviseur :
- Langages Web
Modérateur :
- XML/XSL
- ADA
Avatar de hibou57
Inscrit : 13/02/2005
Messages : 560
Message
#151993
Posté le 16/04/08 à 16:52
Pour le collation, tout dépend de la manière dont tu traite les chaînes dans ta base (ça dépend du sens des données de la base). Je dirais que tu ne dois pas choisir le collation à seule fin de pouvoir faire une comparaison avec un caractère précis. Si tu n'as pas de critère(s) linguistique(s) particulier(s), la collation xxx_bin fait trés bien l'affaire. De toute façon, si tu ne peux pas faire de comparaison sur le symbole EURO, ce n'est à priori pas un problème de collation (car en dehors de la collation par défaut, les collations définissent plutôt des régles de comparaison des chaînes en respect de certaines règles linguistiques).

Reste à voir si la base à bien été convertie..... peut-être qu'exporter les tables, les effacer et les re-importer ferait l'affaire ?

Je sais, c'est radicale, mais c'est ce que j'ai eu à faire récement pour résoudre un problème d'encodage : je n'y étais pas parvenu en agissant sur les données de la base, mais seulement en exportant puis re-important.

Est-ce que c'est une base d'essais ou est-ce que c'est une base installée et en service ? Parce que dans le deuxième cas par contre, il faudra peut-être éviter de s'amuser à ça.

Je repasserai voir le cas plus en détails plus tard, parce que là je me sent un peu "naze" (fatigué).

Si c'est une base d'essai, essai de faire un export/import au moins sur une table significative sur la requête, pour voir si le résultat est le même.

Ce qui est bizzare, c'est le "incorrect string value \xC2\x80 par...", comme s'il ne décodait pas l'UTF-8 et qu'il le traitait comme une chaîne ASCII Smiley assez déroutant (normalement il ne devrait percevoir qu'un caractère, et non pas deux.. il semble percevoir l'encodage du caractère au lieu de percevoir le caractère)
__________________________
Lasidoré : Editeur XML orienté sémantique/Online XML editor - Alpha
Utiliser le Compilateur Ada GNAT - Fiabilité professionnelle, Ada we trust
Opera, Le navigateur - Léger, rapide, efficace, joli et source d'inspiration
DragonFly, Le debugger JavaScript, CSS, ... et HTML - Only on Opera
Exalead Search - Beceause Google is not a synonym of “ search engine ”

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

hibou57
Rédacteur MP
Superviseur :
- Langages Web
Modérateur :
- XML/XSL
- ADA
Avatar de hibou57
Inscrit : 13/02/2005
Messages : 560
Message
#151995
Posté le 16/04/08 à 17:12
suite ....

Sinon, voici la syntaxe pour changer soit l'encodage de toute une base, soit l'encodage d'une table seule :

Pour une base toute entière :
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]

Pour une table seule :
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]

Retour sur une question : pour le collation, je te suggère également utf8_unicode_ci, pour éviter les mauvaises surprises. En tous cas, le xxx_ci est ce qui est le plus souvent attendu (comparaisons des chaînes sans faire de différences entre minuscules et majuscules - ci = case insensitive). Soit utf8_bin, soit utf8_unicode_ci, selon le cas.
__________________________
Lasidoré : Editeur XML orienté sémantique/Online XML editor - Alpha
Utiliser le Compilateur Ada GNAT - Fiabilité professionnelle, Ada we trust
Opera, Le navigateur - Léger, rapide, efficace, joli et source d'inspiration
DragonFly, Le debugger JavaScript, CSS, ... et HTML - Only on Opera
Exalead Search - Beceause Google is not a synonym of “ search engine ”

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

Visiteur MP
Membre du club
Inscrit :
Messages : 1255
Message
#151997
Posté le 16/04/08 à 17:41
Cela ne change rien Smiley
pour répondre à ton interrogation sur le "incorrect string value \xC2\x80 par..." voici le chaine encodé en UTF-8:
Aucun dit :
80536434, 'Lexique.Arbitrage', 'Arbitrage', 'Arbitrage', '', 'fr', 0, '2008-04-15 18:48:14', '2008-04-15 18:48:14', '2008-04-15 18:48:14', 'XWiki.Root', 'XWiki.Root', 'XWiki.Root', 'Lexique', '1 Arbitrage

Changer le FCPE choisi pour son +®pargne est possible suivant l''+®volution du march+® mobilier. Par exemple : quitter un FCPE expos+® pour un FCPE +®quilibr+® ou l''inverse. Les frais de transfert sont de 2 -Ç par op+®ration.

Source : [Glossaire Systalians>http://10.67.92.110:8080/xwiki/bin/download/Lexique/WebHome/GlossaireSystalians.xls]', '1.1', '', 'WebHome', '', 2, '', '', '', b'0'


Merci de chercher ça fait 2 jours que je suis dessus et j'avance pas.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

hibou57
Rédacteur MP
Superviseur :
- Langages Web
Modérateur :
- XML/XSL
- ADA
Avatar de hibou57
Inscrit : 13/02/2005
Messages : 560
Message
#152014
Posté le 17/04/08 à 05:06
Je compatis Thundara Smiley

Je viens de vérifier : la chaîne 0xC2, 0x80 ne correspond effectivement pas à un caractère connu sous PSPad.

Je viens de décoder manuellement : c'est bien un encodage UTF-8 valide, et il correspond tout simplement au code de caractère 0x80, ou plus strictement, c'est le caractère U+0080 (le bit n° 7 est à 1, donc c'est obligatoirement encodé sur deux octets au moins). Le problème c'est que le caracère U+0080 n'est pas un caractère graphique, mais un caractère de commande (C1). Il ne devrait d'ailleur normalement jamais apparaître dans du texte, et mon parseur UTF-8 maison le rejèterait lui aussi.

Donc MySQL a raison de detecter une erreur, et le problème vient de l'encodage de ta chaîne. Peut-être que le problème vient de Perle.

Il faudrait que tu réduise la chaîne, que tu en enlève des bouts à tatons, pour isoler la partie de la chaîne qui se trouve être mal encodée.
__________________________
Lasidoré : Editeur XML orienté sémantique/Online XML editor - Alpha
Utiliser le Compilateur Ada GNAT - Fiabilité professionnelle, Ada we trust
Opera, Le navigateur - Léger, rapide, efficace, joli et source d'inspiration
DragonFly, Le debugger JavaScript, CSS, ... et HTML - Only on Opera
Exalead Search - Beceause Google is not a synonym of “ search engine ”

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

Visiteur MP
Membre du club
Inscrit :
Messages : 1255
Message
#152033
Posté le 17/04/08 à 14:04
J'ai inséré toutes mes définitions dans une base de test pour repérer les caractères refusés, ça donne ça :

Code : Caractère => Remplacement
\xC2\x80 : € => euros
\xC2\x85 : … => ...
\xC2\x9C : œ => oe
\xC2\x92 : ’ => '
\xC2\x96 : - => –

j'ai donc utilisé un s/€/euros/ pour remplacer le symbole € dans les définitions et idem pour les autres caractères refusés. Ca marche mais si jamais je réutilise le script avec d'autre définitions et qu'il y a des caractères refusés qui ne sont pas dans cette liste il y aura de nouvelles erreurs.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE

hibou57
Rédacteur MP
Superviseur :
- Langages Web
Modérateur :
- XML/XSL
- ADA
Avatar de hibou57
Inscrit : 13/02/2005
Messages : 560
Message
#152034
Posté le 17/04/08 à 14:14
Je reprend par exemple le symbol EURO.

Le code-point Unicode pour ce caractère € est U+20AC. En UTF-8, il s'encode donc 0xE2,0x82,0xAC. En UTF-16LE, c'est 0xAC,0x20.

Et même dans la page de code ISO8859-15, EURO a le code 0xA4.

Je me demande donc d'ou vient la séquence 0xC2,0x80 pour encoder le caractère EURO.

Il y a un problème d'encodage ou de page de code quelque part.... Smiley

Ce n'est pas normal que des caractères graphiques finissent encodé comme des caractères de commande.

Le format d'encodage UTF-8 est bon. Donc on peut supposer que ce n'est pas l'encodeur UTF-8. Comme nous avons éliminer MySQL comme source possible du problème (il reçois quelque chose d'invalide, il réagis, c'est normal), ne reste alors plus qu'un problème de page de code.

Quelle est la page de code du source Perle ?

L'interpréteur Perle est-il proprement configuré pour la page de code du fichier source ?
__________________________
Lasidoré : Editeur XML orienté sémantique/Online XML editor - Alpha
Utiliser le Compilateur Ada GNAT - Fiabilité professionnelle, Ada we trust
Opera, Le navigateur - Léger, rapide, efficace, joli et source d'inspiration
DragonFly, Le debugger JavaScript, CSS, ... et HTML - Only on Opera
Exalead Search - Beceause Google is not a synonym of “ search engine ”

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE
POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

PREMIERE PAGE

PAGE PRECEDENTE Page précédente

Page suivante

PAGE SUIVANTE DERNIERE PAGE

FORUM PERL



    PAGE : [1]



.: Site Web développé par Julien Pichot et l'équipe MPWG avec www.evolvia-web.com :.