Python编码MySQL:

4

I have the follow python script (tes.py):

#!/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 | 
+-------+----------------------------------------------------------------------------------------------+

控制台输出正常:

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

问题:
脚本没有将ñ插入到表中,而是插入了一个错误的字符:
select * from test;
+------+
| test |
+------+
|| 
|| 
|| 
|| 
|| 
|| 
|| 
+------+
7 rows in set (0.00 sec)

有人能帮我吗??

先谢谢啦!


3
你尝试过在Python中使用SELECT吗?它可能已经被正确存储,但在MySQL的控制台输出中会出现混乱。 - Rob Wouters
3
微笑表情和页脚并不能帮助您获得答案,建议今后不要使用它们。 - richo
4个回答

8

尝试添加'use_unicode'。

秘诀是在连接参数中添加charset="utf8",并使用use_unicode=True。来源

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

谢谢Latty!但是,通过添加"use_unicode=True"仍然存在同样的问题 :( - Emiliano Gustavo Nuñez
@HalNuevemil 嗯,恐怕我不知道。为了确保数据库中的内容正确显示,请检查您的控制台是否支持Unicode。 - Gareth Latty
确切地说,Latty,我通过PhpMyAdmin工具检查了表格,数据是正确的。这可能是mysql控制台中的可视化问题。这很疯狂,因为我的系统区域设置是UTF-8。 - Emiliano Gustavo Nuñez
谢谢!这对我有用,所以我猜你需要这样做 并且 修改你的数据库排序规则,例如使用; ALTER DATABASE database CHARACTER SET UTF8 COLLATE utf8_general_ci; - ZN13
这个答案是正确的吗?应该接受它。 - Aaron

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
唯一有效的事情是我正在工作。 - Aleksei Petrenko

1

0

尝试:

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

连同 use_unicode = True 一起。


我尝试了但问题仍然存在,我认为数据是以ISO字符集插入的,因为当我通过php获取数据时,我得到的是ISO而不是UTF。 - Emiliano Gustavo Nuñez
更多数据:如果我尝试这样做:mysql -u ibrick -pxx -h localhost ibrick -N -B -e“ INSERT INTO test(test)VALUES('ñ')”是可以的,我看到:| Ñ |

但如果我尝试使用:#!/usr/bin/env python

-- coding: utf-8 --

import MySQLdbquery = u"INSERT INTO test(test) VALUES ('ñ')" print query + "\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 ()我看到 |�|
- Emiliano Gustavo Nuñez
如果你正在将文件保存为ISO-8859格式,请不要告诉Python它是UTF-8;将# -- coding:设置为你实际保存的文件编码。 - Wooble
我想将数据保存为UTF-8编码。我的系统是UTF-8,MySQL表也是UTF-8,文件脚本也是UTF-8,一切都是UTF-8,但不知道为什么数据却以ISO编码保存。我真的很困惑。 - Emiliano Gustavo Nuñez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接