2012-02-06 2 views
4

J'ai le script python suivi (de tes.py):python encodage mysql :(

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import MySQLdb 

query = "INSERT INTO test(test) VALUES ('ñ')" 
print query + "\n" 

conn = MySQLdb.connect (host = "localhost", user = "ibrick", passwd = "x", db = "ibrick", charset="utf8") 
conn.names="utf8" 
cursor = conn.cursor() 
cursor.execute (query); 
cursor.close() 
conn.commit() 

fichier encodage utf-8:

$ file -i tes.py 
tes.py: text/x-java charset=utf-8 

système de codage UTF:

#locale 
LANG=es_AR.UTF-8 
LC_CTYPE="es_AR.UTF-8" 
LC_NUMERIC="es_AR.UTF-8" 
LC_TIME="es_AR.UTF-8" 
LC_COLLATE="es_AR.UTF-8" 
LC_MONETARY="es_AR.UTF-8" 
LC_MESSAGES="es_AR.UTF-8" 
LC_PAPER="es_AR.UTF-8" 
LC_NAME="es_AR.UTF-8" 
LC_ADDRESS="es_AR.UTF-8" 
LC_TELEPHONE="es_AR.UTF-8" 
LC_MEASUREMENT="es_AR.UTF-8" 
LC_IDENTIFICATION="es_AR.UTF-8" 
LC_ALL= 
echo "ñññ" > /tmp/test.txt 

file /tmp/test.txt 
/tmp/test.txt: UTF-8 Unicode text 

Codage de table MYsql UTF8:

mysql> show create table test; 
+-------+----------------------------------------------------------------------------------------------+ 
| Table | Create Table                     | 
+-------+----------------------------------------------------------------------------------------------+ 
| test | CREATE TABLE `test` (
    `test` varchar(10) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 | 
+-------+----------------------------------------------------------------------------------------------+ 

Console outupt est OK:

#./tes.py 
INSERT INTO test(test) VALUES ('ñ') 
problème

:

Le script ne pas insérer ñ dans le tableau .. il insère un mauvais caractère:

select * from test; 
+------+ 
| test | 
+------+ 
| � | 
| � | 
| � | 
| � | 
| � | 
| � | 
| � | 
+------+ 
7 rows in set (0.00 sec) 

Tout le monde me aider? ?

Merci d'avance!

+3

Avez-vous essayé SELECT avec python? Il pourrait être stocké correctement mais être foiré dans la sortie console de MySQL. –

+3

Le sourire et le pied de page ne vous aident pas à obtenir des réponses, je les laisserais à l'avenir. – richo

Répondre

7

Essayez d'ajouter 'use_unicode'.

L'ingrédient secret est d'ajouter un charset = » UTF8" à votre connexion paramètres et use_unicode = True. Source

db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME, charset="utf8", use_unicode=True) 
+0

remerciez Latty! mais, en ajoutant "use_unicode = True" continuer le même problème :( –

+0

@HalNuevemil Hrm, je crains de ne pas savoir alors, je voudrais vérifier votre console prend en charge unicode, juste au cas où il est bien dans la DB, mais doesn ' –

+0

exctly Latty, j'ai vérifié la table par PhpMyAdmin Tool et les données sont correctes .. c'est peut-être un problème de visualisation dans mysql console c'est fou car mon locale est UTF-8 dans mon système .. –

0

essayer:

query = u"INSERT INTO test(test) VALUES ('ñ')" 

avec use_unicode = True.

+0

J'ai essayé mais continuez le même problème, je pense que les données sont affichées en tant que charset ISO parce que quand y obtenir les données par php je l'obtiens en ISO et non en UTF. –

+0

plus de données: si j'essaie ceci: mysql -u ibrick -pxx -h localhost ibrick -N -B -e "INSERT INTO test (test) VALUES ('ñ')" est OK, y voir : | ñ | + ------ mais si je tente avec: #/usr/bin/env python # - * - codage: utf-8 - * - import MySQLdb requête = u » INSERT INTO test (test) VALUES ('ñ') " requête d'impression +" \ n " conn = MySQLdb.connect (hôte =" localhost ", utilisateur =" ibrick ", passwd =" ibrick ", db =" ibrick ", charset =" utf8 ", use_unicode = Vrai) conn.names =" utf8 " cursor = conn.cursor() cursor.execute (requête); cursor.close() conn.commit() Je vois | | –

+0

Eh bien, si vous enregistrez le fichier dans ISO-8859, ne dites pas à Python que c'est UTF-8; définissez le '# - coding:' sur l'encodage du fichier avec lequel vous avez enregistré. – geoffspear

3
import MySQLdb 

# connect to the database 
db = MySQLdb.connect("****","****","****","****") #don't use charset here 

# setup a cursor object using cursor() method 
cursor = db.cursor() 

cursor.execute("SET NAMES utf8mb4;") #or utf8 or any other charset you want to handle 

cursor.execute("SET CHARACTER SET utf8mb4;") #same as above 

cursor.execute("SET character_set_connection=utf8mb4;") #same as above 

# run a sql question 
cursor.execute("****") 

... 

#and make sure the mysql settings are correct, data too 
+1

+1 Pas clair pourquoi cela a été voté plus tôt. Informations utiles. – mkoistinen

+0

La seule chose qui fonctionne pour moi –