向各位请教,python程序中文写入MySQL数据库时的问题

向各位请教,python程序中文写入MySQL数据库时的问题

我的代码如下:

[Copy to clipboard] [ - ]
CODE:
insert = "INSERT INTO records (number, username, address, pccode, recorder, pcerror, egname) VALUES (200612200033, u'李鲜花', '%s', '%s', '%s', '%s', ' ')" % (address, pccode, recorder, pcerror)
cursor.execute(insert)

却报:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc0 in position 138: ordinal not in range(12
的错误
写入英文没有问题,中文该如何解决呢?我查到的资料说用encode('utf-8'),也用过cursor.execute(unicode(insert), "utf-8",但均无效,谢谢各位!
我是winXP平台,最初用的是appserv-win32-2.5.6,集成的是MySQL 5.0.22,将MySQL的默认字符集设为utf8和gbk均无效,于是在MySQL的命令行下直接运行insert命令时始终报data too long的错误,于是更换为APMServ5.2.0,MySQL是5.0.27,设为utf8时,MySQL命令行下运行insert时不报错了,但用phpmyadmin查看,中文部分都是空的,改为gbk后终于正常.但在python程序中运行insert时,仍然报UnicodeDecodeError的错误,继续摸索中...
Mysql字符集为Ladin_1,数据库整个备份到另外一台机子上,查询数据出现以下提示
'ascii' codec can't decode byte 0xb8 in position 270: ordinal not in range(12

解决方法:
修改python的default encoding
在python\lib\site.py 文件中 encoding = "ascii" 替换成 encoding = "latin1"
谢谢goophy,改成utf8后报错变成:

[Copy to clipboard] [ - ]
CODE:
cursor.execute(unicode(insert, 'gbk'))
TypeError: decoding Unicode is not supported

unicode不支持?我这个就是unicode版本的啊?

如果把site.py中的encoding改为gbk,则报错为

[Copy to clipboard] [ - ]
CODE:
insert = "INSERT INTO records (spmnumber, username, address, pccode, recorder, pcerror, egname) \
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 9-10: illegal multibyte sequence

怪异啊
解决,参考的李卫公的长安城网站,非常不错,里面几乎都是我编程时遇到的实际问题

[Copy to clipboard] [ - ]
CODE:
    问题的根源似乎在于,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()到底在哪里设置的,我跟了许久也无从知道,即使这样,还是有办法解决这个问题:
    修改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",就可以了.

最终,我的代码如下即可正常向数据库中写入中文了:

[Copy to clipboard] [ - ]
CODE:
cursor.execute(u"INSERT INTO records (number, username, address, pccode, recorder, pcerror, egname) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', ' ')" %(number, address, pccode, recorder, pcerror), char = "GBK")

晕倒,set names 'gbk' 用过没有?
我的python mysql就从来不出这种错误啊
这也是我很奇怪的一个地方,我运行cursor.execute(set names 'gbk' )这个命令是无效的,直接在IDLE里运行测试也无效.而在MySQL的命令行里运行set names gbk就可以,用show variables like 'character_set_%'查看也都设定为gbk了,可写入时仍然报错.我个人也认为是cursor的execute函数的问题,改了就好了.
不知道ttvast能否共享一小段代码,请教一下你是如何来实现的呢?谢谢.
是不是应该把'set names "gbk"'写成一个字符串来运行啊。


[Copy to clipboard] [ - ]
CODE:
import MySQLdb
conn = MySQLdb.connect (host = "localhost", user = "root", passwd = "***", db = "test")
cursor = conn.cursor ()
setname = 'set names "gbk"'
cursor.execute (setname)

测试无效