Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme d'accent et mysql

7 réponses
Avatar
ReM
Bonjour,

J'utilise MySQLdb sur un serveur mutualisé chez OVH.
J'ai une erreur sur l'insertion ou la mise à jour d'un champ comportant
un accent.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position
206: ordinal not in range(128)
args = ('ascii', "INSERT INTO proprietaire ( id, civilite, nom,
pr..., '', \n '', '', '', '', 0 )", 206, 207, 'ordinal not in range(128)')
encoding = 'ascii'
end = 207
object = "INSERT INTO proprietaire ( id, civilite, nom, pr...,
'', \n '', '', '', '', 0 )"
reason = 'ordinal not in range(128)'
start = 206

Pourtant via PhpMyAdmin, je n'ai pas de pb quand j'exécute la req dans
l'interface SQL et je suis pas très fort en encode.

Si quelqu'un avait une idée... Merci ;o)

PS mes scripts commencent par
# -*- coding: iso-8859-1 -*-
Et les champs de la db, qu'ils soient en latin1_swedish_ci ou en
latin1_bin, c'est pareil

ReM

7 réponses

Avatar
jean-michel bain-cornu
Bonsoir,
J'utilise MySQLdb sur un serveur mutualisé chez OVH.
J'ai une erreur sur l'insertion ou la mise à jour d'un champ comportant
un accent.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position
206: ordinal not in range(128)
args = ('ascii', "INSERT INTO proprietaire ( id, civilite, nom,
pr..., '', n '', '', '', '', 0 )", 206, 207, 'ordinal not in range(128)')
encoding = 'ascii'
end = 207
object = "INSERT INTO proprietaire ( id, civilite, nom, pr..., '',
n '', '', '', '', 0 )"
reason = 'ordinal not in range(128)'
start = 206


L'erreur me semble bizarre, tu n'as pas de n° de ligne ni le nom du
script qui plante ?
Par ailleurs, si par hasard tu as la ligne
query = query.encode(charset)
dans ...MySQLdb/cursors.py aux alentours de la ligne 146, essaye de la
mettre en commentaire, c'est une bêtise. Il faut avoir les droits
d'écriture au répertoire Lib/site-packages de python.
Et je sais, j'aurais dû le signaler au développeur, mais je n'ai pas eu
le temps.

Avatar
jean-michel bain-cornu
Par ailleurs, si par hasard tu as la ligne
query = query.encode(charset)
dans ...MySQLdb/cursors.py aux alentours de la ligne 146, essaye de la
mettre en commentaire, c'est une bêtise. Il faut avoir les droits
d'écriture au répertoire Lib/site-packages de python.
Et je sais, j'aurais dû le signaler au développeur, mais je n'ai pas eu
le temps.


Dans la version 1.2.2, il y a
if isinstance(query, unicode):
query = query.encode(charset)
ce qui semble indiquer que l'erreur a été corrigée, ou au moins qu'une
tentative a été faite.
Il faudrait confirmer que ton erreur vient de cette partie là, et savoir
quelle version de MySQLdb tu utilises.

A+
jm

Avatar
ReM
Par ailleurs, si par hasard tu as la ligne
query = query.encode(charset)
dans ...MySQLdb/cursors.py aux alentours de la ligne 146, essaye de la
mettre en commentaire, c'est une bêtise. Il faut avoir les droits
d'écriture au répertoire Lib/site-packages de python.
Et je sais, j'aurais dû le signaler au développeur, mais je n'ai pas
eu le temps.


Dans la version 1.2.2, il y a
if isinstance(query, unicode):
query = query.encode(charset)
ce qui semble indiquer que l'erreur a été corrigée, ou au moins qu'une
tentative a été faite.
Il faudrait confirmer que ton erreur vient de cette partie là, et savoir
quelle version de MySQLdb tu utilises.

A+
jm


J'utilise la version 1.2.1_p2 de chez OVH, je suis en mutualisé !

Plus de détails sur l'erreur :
/usr/lib/python2.4/site-packages/MySQLdb/cursors.py in
execute(self=<MySQLdb.cursors.Cursor object>, query="UPDATE proprietaire
n SET civil...'ma', notaire_id = 1n WHERE id = 1", args=None)
144 db = self._get_db()
145 charset = db.character_set_name()
146 query = query.encode(charset)
147 if args is not None:
148 query = query % db.literal(args)
query = "UPDATE proprietaire n SET civil...'ma', notaire_id = 1n WHERE
id = 1", query.encode = <built-in method encode of str object>, charset
= 'latin1'


J'essaie d'inserer le mot Rémi dans un champ de type VARCHAR

Merci ;o)

ReM


Avatar
jean-michel bain-cornu
J'utilise la version 1.2.1_p2 de chez OVH, je suis en mutualisé !

Plus de détails sur l'erreur :
/usr/lib/python2.4/site-packages/MySQLdb/cursors.py in
execute(self=<MySQLdb.cursors.Cursor object>, query="UPDATE proprietaire
n SET civil...'ma', notaire_id = 1n WHERE id = 1", args=None)
144 db = self._get_db()
145 charset = db.character_set_name()
146 query = query.encode(charset)
147 if args is not None:
148 query = query % db.literal(args)
query = "UPDATE proprietaire n SET civil...'ma', notaire_id = 1n WHERE
id = 1", query.encode = <built-in method encode of str object>, charset
= 'latin1'


Ce ressemble bien au bug que j'avais identifié (ligne 146).
Tu peux essayer de passer un unicode à la place d'un string :
ex : sqlTxt = unicode('insert..."Rémi"...etc..','iso-8859-1')
instruction_sql(sqlTxt)
Le iso-8859-1 colle bien si tu es sous windows. Si tu es sous linux, ce
serait plutôt utf-8, tout dépend du charset dans lequel le programme a
été saisi.
Tu peux aussi installer la dernière version de MySQLdb dans ton espace
perso ; tout dépend de la quantité de modifs que tu devras faire dans
ton code pour passer des unicodes au lieu des strings. Si tu en as
beaucoup, ça vaut le coup d'essayer d'installer cette dernière version.

Quand tu auras passé un unicode, la ligne 146 retransformera cet unicode
en string dans un charset qui sera supposé plaire à MySQL, et ça devrait
fonctionner. L'idée de tout ça est de gérer automatiquement la
translation du charset du programme vers le charset de la base. L'idéal
serait de commenter la ligne 146 qui ne sert à rien si tu n'as qu'un
jeux de caractères à gérer.

Tout ça n'a visiblement pas trop bien été testé au départ par notre bon
Andy Dustman, qui a probablement autre chose à faire que de se
préoccuper des caractères accentués et autres étrangetés étrangères...

Bon courage,
jm

Avatar
ReM
J'utilise la version 1.2.1_p2 de chez OVH, je suis en mutualisé !

Plus de détails sur l'erreur :
/usr/lib/python2.4/site-packages/MySQLdb/cursors.py in
execute(self=<MySQLdb.cursors.Cursor object>, query="UPDATE
proprietaire n SET civil...'ma', notaire_id = 1n WHERE id = 1",
args=None)
144 db = self._get_db()
145 charset = db.character_set_name()
146 query = query.encode(charset)
147 if args is not None:
148 query = query % db.literal(args)
query = "UPDATE proprietaire n SET civil...'ma', notaire_id = 1n
WHERE id = 1", query.encode = <built-in method encode of str object>,
charset = 'latin1'


Ce ressemble bien au bug que j'avais identifié (ligne 146).
Tu peux essayer de passer un unicode à la place d'un string :
ex : sqlTxt = unicode('insert..."Rémi"...etc..','iso-8859-1')
instruction_sql(sqlTxt)
Le iso-8859-1 colle bien si tu es sous windows. Si tu es sous linux, ce
serait plutôt utf-8, tout dépend du charset dans lequel le programme a
été saisi. (...)



ça marche avec ça !!!!
Super et moindre modif pour moi
Merci beaucoup !!!


Avatar
jean-michel bain-cornu
Merci beaucoup !!!



Vraiment pas de quoi, pour une fois que c'est moi qui donne un truc dans
ce forum...

Avatar
scorplex
jean-michel bain-cornu a écrit le 29/09/2007 à 09h49 :
Merci beaucoup !!!




Vraiment pas de quoi, pour une fois que c'est moi qui donne un truc dans
ce forum...


en un mot MERCIIIIIIII !!!!!!!

Je lutte là dessus depuis des jours, j'avais plein de soucis dans mon python de cet ordre (print de chaine avec des accents etc) que j'ai corrigé sans trop de difficulté mais je récupère une chaine dans une base pour aller la recopier dans une autre et dés que je voulais faire une requête insert, paf meme message d'erreur

Je tourne en rond depsui des jours et j'ai jamais été remettre en cause python lui même et sans toi je ne l'aurai jamais fait !!

Merci merci merci,
Je sais que je déterre un peu un vieux post mais vu le temps que j'ai passé sur cette M_*ù$?!! je me suis inscrit juste pour te dire merci !!!!