2013-07-08 47 views
0

我有一个GBK编码数据表。有时,使用unicode字符串的插入SQL失败,出现异常:mysql-connector-python GBK编码错误

mysql.connector.errors.ProgrammingError:处理失败的pyformat-parameters; 'gbk'编解码器无法在位置14处编码字符u'\ u2022':非法

这是由在mysql-connector-python库中编码一个没有参数'ignore'的unicode对象造成的。但我无法修改代码。如何解决这个问题呢?

+0

在提交给mysql库之前过滤这些字符,我猜。 – hago

+0

我这么认为。谢谢! –

回答

1

hago已经提到要过滤不属于GBK的Unicode字符的评论,但我想给出一个使用MySQL Connector/Python的完整示例。

# -*- coding: utf-8 -*- 

import mysql.connector 

cnx = mysql.connector.connect(
    database='test', charset='gbk', use_unicode=False 
) 
cur = cnx.cursor() 

cur.execute("DROP TABLE IF EXISTS gbktest") 
table = (
    "CREATE TABLE gbktest (" 
    "id INT AUTO_INCREMENT KEY, " 
    "c1 VARCHAR(40)" 
    ") CHARACTER SET 'gbk'" 
) 
cur.execute(table) 

data = { 
    'c1': u'\u2022国家标准'.encode('gbk', 'ignore') 
} 
cur.execute("INSERT INTO gbktest (c1) VALUES (%(c1)s)", data) 
cnx.commit() 
cur.execute("SELECT id, c1 FROM gbktest") 
rows = cur.fetchall() 
# Terminal using UTF-8 encoding: 
#print rows[0][1].decode('gbk') 
# Terminal using GBK encoding: 
print rows[0][1] 

最后两行需要被注释/取消注释取决于您的终端是否使用UTF-8或GBK编码。

+0

谢谢你的代码! –