关于python之MySQLdb的编码
2012-04-24 18:10
369 查看
转自:http://blog.donews.com/maverick/archive/category/%E5%BC%80%E5%8F%91/page/3
Python连接MySQL时需要用到 MySQLdb,按照给出的例子,操作MySQL的代码大致如下:
""" Python to MySQL using mysql-python"""
import MySQLdb
# Establich a connection
conn = MySQLdb.connection(host="192.168.200.66",
user="trainee",
passwd="abc123",
port=3306,
db="forsale")
# Run a MySQL query from Python and get the result set
cursor = conn.cursor()
sql = ’select version();’
cursor.execute(sql)
result = cursor.fetchall()
print result[0][0]
cursor.close()
conn.close()
不过,在执行一些包含UTF8字符的SQL语句时,往往会见到这样的错误:
‘ascii’ codec can’t encode character ……’
或者
‘latin-1′ codec can’t encode character ……’
这种情况下,即使在py文件的头部加上
# -*- coding: utf-8 -*-
并且在连接语句中加上两个参数use_unicode和charset
conn = MySQLdb.connection(host="192.168.200.66",
user="trainee",
passwd="abc123",
port=3306,
db="forsale",
use_unicode=True,
charset="utf-8")
也无济于事
问题的根源似乎在于,MySQLdb的cursor在执行execute操作时,运行了如下代码(cursor.py第146行):
charset = db.character_set_name()
query = query.encode(charset)
我发现,无论怎么指定编码,db.character_set_name()获得的,似乎都是latin-1或者ascii(与报错语句提示的Codec一致),这样的codec当然无法编码UTF-8的字符了。
db.character_set_names()到底在哪里设置的,我跟了许久也无从知道,即使这样,还是有办法解决这个问题:
1.在query = query.encode(charset)直接加上一句charset = "utf-8"
这是最笨的方法,改动最小的权宜之计,硬编码,只能应付UTF-8的SQL情况;
2.修改cursor的execute函数,增加一个char参数。
原来的execute是这样定义的:
def execute(self, query, args=None):
修改之后为
def execute(self, query, char="utf-8", args=None):
然后将
charset = db.character_set_name()
query = query.encode(charset)
改为
charset = char
query = query.encode(charset)
此后如果要执行包含GBK字符的SQL语句,只要在调用execute函数时增加设定char="GBK",就可以了。
Python连接MySQL时需要用到 MySQLdb,按照给出的例子,操作MySQL的代码大致如下:
""" Python to MySQL using mysql-python"""
import MySQLdb
# Establich a connection
conn = MySQLdb.connection(host="192.168.200.66",
user="trainee",
passwd="abc123",
port=3306,
db="forsale")
# Run a MySQL query from Python and get the result set
cursor = conn.cursor()
sql = ’select version();’
cursor.execute(sql)
result = cursor.fetchall()
print result[0][0]
cursor.close()
conn.close()
不过,在执行一些包含UTF8字符的SQL语句时,往往会见到这样的错误:
‘ascii’ codec can’t encode character ……’
或者
‘latin-1′ codec can’t encode character ……’
这种情况下,即使在py文件的头部加上
# -*- coding: utf-8 -*-
并且在连接语句中加上两个参数use_unicode和charset
conn = MySQLdb.connection(host="192.168.200.66",
user="trainee",
passwd="abc123",
port=3306,
db="forsale",
use_unicode=True,
charset="utf-8")
也无济于事
问题的根源似乎在于,MySQLdb的cursor在执行execute操作时,运行了如下代码(cursor.py第146行):
charset = db.character_set_name()
query = query.encode(charset)
我发现,无论怎么指定编码,db.character_set_name()获得的,似乎都是latin-1或者ascii(与报错语句提示的Codec一致),这样的codec当然无法编码UTF-8的字符了。
db.character_set_names()到底在哪里设置的,我跟了许久也无从知道,即使这样,还是有办法解决这个问题:
1.在query = query.encode(charset)直接加上一句charset = "utf-8"
这是最笨的方法,改动最小的权宜之计,硬编码,只能应付UTF-8的SQL情况;
2.修改cursor的execute函数,增加一个char参数。
原来的execute是这样定义的:
def execute(self, query, args=None):
修改之后为
def execute(self, query, char="utf-8", args=None):
然后将
charset = db.character_set_name()
query = query.encode(charset)
改为
charset = char
query = query.encode(charset)
此后如果要执行包含GBK字符的SQL语句,只要在调用execute函数时增加设定char="GBK",就可以了。
相关文章推荐
- 关于python3的编码问题
- 关于python中json load出来编码为unicode的问题的解决
- 关于java调用python2.7 脚本时遇到的中文编码错误,让人头疼的事情,浪费一天时间
- 关于python中的编码问题汇总
- 关于python编码的一些理解
- Python字符串编码+MySQLdb中的中文字符问题
- Python——关于中文编码的问题
- Python3中关于中文编码的问题
- 关于python的str和unicode以及编码的问题
- 关于python3的一些编码问题
- 【待解决】关于python-mysqldb的安装
- Python2和Python3之间关于字符串编码处理的差别
- 关于python的编码问题和raw_input的乱码问题
- python学习笔记--关于编码
- 关于python的编码问题
- 关于python爬虫的编码错误
- 关于python 的url_encode关于的嵌套字典类型变量的编码扩展
- python2.7中关于编码,json格式的中文输出显示
- Python学习第一天--关于编码格式
- 在Python中关于中文编码问题的处理建议