【问题标题】:python encoding mysql :( [duplicate]python编码mysql :( [重复]
【发布时间】:2012-02-06 02:28:20
【问题描述】:

我有以下 python 脚本 (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)

有人帮帮我吗?

提前致谢!

【问题讨论】:

  • 你试过用 python 选择吗?它可能被正确存储但在 MySQL 的控制台输出中被弄乱了。
  • 笑脸和页脚无法帮助您获得答案,我以后会忽略它们。

标签: python mysql encoding


【解决方案1】:

尝试添加“use_unicode”。

秘诀是在您的连接中添加一个 charset=”utf8” 参数,并且 use_unicode=True。 Source

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

【讨论】:

  • 感谢拉蒂!但是,通过添加“use_unicode=True”继续同样的问题:(
  • @HalNuevemil Hrm,恐怕那时我不知道。我会检查您的控制台是否支持 unicode,以防万一它在数据库中正常但无法正确显示。
  • 正是 Latty,我通过 PhpMyAdmin 工具检查了表格,数据是正确的。这可能是 mysql 控制台中的可视化问题。这太疯狂了,因为我的语言环境在我的系统中是 UTF-8..
  • 谢谢!这对我有用,所以我有一种预感,您需要这样做更改数据库的排序规则,例如使用; ALTER DATABASE 数据库 CHARACTER SET UTF8 COLLATE utf8_general_ci;
  • 那么这个答案是正确的吗?应该接受它
【解决方案2】:
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 不清楚为什么这之前被否决了。有用的信息。
  • 唯一对我有用的东西
【解决方案3】:

MySQL 客户端使用 latin1 作为其默认字符编码。见http://dev.mysql.com/doc/refman/5.0/en/mysql-command-options.html#option_mysql_default-character-set

启动mysql客户端时使用--default-character-set=utf8

【讨论】:

    【解决方案4】:

    尝试:

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

    还有use_unicode = True

    【讨论】:

    • 我尝试过但仍然出现同样的问题,我认为数据是作为 ISO 字符集插入的,因为当您通过 php 获取数据时,我会以 ISO 格式而不是 UTF 格式获取数据。
    • 更多数据:如果我尝试这个:mysql -u ibrick -pxx -h localhost ibrick -N -B -e "INSERT INTO test(test) VALUES ('ñ')" 是可以的,y见:| ñ | +------ 但如果我尝试使用:#!/usr/bin/env python # -- coding: utf-8 -- import MySQLdb query = u"INSERT INTO test(test ) VALUES ('ñ')" 打印查询 + "\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 (查询); cursor.close() conn.commit() 我明白了| � |
    • 好吧,如果你用 ISO-8859 保存文件,不要告诉 Python 它是 UTF-8;将# -- coding: 设置为您保存时使用的实际文件编码。
    • 我想把数据保存成UTF-8..我的系统是UTF-8,mysql表是utf-8,文件脚本是utf-8,一切都是UTF-8,,我不知道为什么数据保存在 ISO.. 我真的很困惑..
    猜你喜欢
    • 2015-12-12
    • 2015-02-28
    • 1970-01-01
    • 2018-02-18
    • 2014-01-12
    • 2018-09-16
    • 2015-03-30
    • 2012-09-03
    • 2014-12-10
    相关资源
    最近更新 更多