2012-02-06 70 views
4

我有后续的python脚本(tes.py):蟒蛇编码的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() 

文件编码UTF-8:

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

系统编码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 

MYsql表编码UTF8:

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

控制台outupt是OK:

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

问题:

脚本不会插入表中的ñ..它插入一个人品不好:

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

有人帮帮我吗? ?

提前致谢!

+3

您是否试过用python进行SELECT?它可能被正确存储,但会在MySQL的控制台输出中混乱。 – 2012-02-06 02:32:03

+3

笑脸和脚注不会帮助你获得答案,我将在未来离开它们。 – richo 2012-02-06 04:12:20

回答

7

尝试添加'use_unicode'。

的秘诀是一个charset =” utf-8“添加到您的连接 参数,并use_unicode =真。 Source

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

感谢Latty!但是,通过添加“use_unicode = True”继续同样的问题:( – 2012-02-06 02:37:56

+0

@HalNuevemil Hrm,恐怕我不知道那么我会检查你的控制台支持unicode,以防万一它在数据库很好,但没有' t显示正确 – 2012-02-06 02:40:50

+0

extyly Latty,我用PhpMyAdmin Tool查看了表格,数据正确..它可能是mysql控制台中的一个可视化问题,这很疯狂,因为我的语言环境在我的系统中是UTF-8 .. – 2012-02-06 02:49:42

0

尝试:

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

随着use_unicode = True

+0

我试过了,但继续同样的问题,我认为数据被作为ISO字符集插入,因为当y通过php获取数据时,我使用ISO而不是UTF。 – 2012-02-06 04:27:57

+0

更多的数据: 如果我试试这个: 的mysql -u ibrick -pxx -h本地主机ibrick -N -B -e “INSERT INTO测试(测试)VALUES( 'N')” 是OK,Y见 :| | ñ| + ------ 但如果我尝试: #在/ usr /斌/包膜蟒蛇 # - * - 编码:UTF-8 - * - 进口MySQLdb的 查询= U” “\ n” conn = MySQLdb.connect(host =“localhost”,user =“ibrick”,passwd =“ibrick”,db =“) ibrick“,charset =”utf8“,use_unicode = True) conn.names =”utf8“ cursor = conn.cursor() cursor.execute(query); cursor.close() conn.commit() I see | | – 2012-02-06 04:42:46

+0

那么,如果你要保存文件在ISO-8859中,不要告诉Python它是UTF-8;将'# - coding:'设置为您保存的实际文件编码。 – geoffspear 2012-02-06 12:39:39

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不明白为什么这是早些时候被低估。有用的信息。 – mkoistinen 2014-08-21 10:37:02

+0

唯一为我工作的 – 2014-09-05 22:20:11