UnicodeDecodeError:'ascii'编解码器无法解码139位的字节0xe2:序号不在范围内(128)

时间:2015-09-19 15:05:42

标签: python mysql python-2.7 twitter

我正在编写一个代码,根据搜索词从twitter获取实时推文并将其保存到Mysql数据库。但是当我在插入数据库时​​运行代码时会引发错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 139: ordinal not in range(128)

我无法理解这里的问题是插入数据库的代码

tweet = json.loads(data);
    #print json.dumps(tweet, indent=4, sort_keys=True)
    #print tweet['text']
    tweetid = tweet['id_str']
    userid = tweet['user']['id_str']
    text = tweet['text'].encode('utf-8')
    cur.execute("""INSERT INTO twitterfeeeds(tweet_id, user_id,body,status) VALUES (%s,%s,%s,'0')"""%(tweetid,userid,text))
    db.commit()

这里的正文是推文中的文字,状态是它是否被处理。

2 个答案:

答案 0 :(得分:3)

不要将您的推文编码为UTF-8,也不要使用字符串格式来创建查询。

改为使用SQL参数:

tweetid = tweet['id_str']
userid = tweet['user']['id_str']
text = tweet['text']
cur.execute(
    """INSERT INTO twitterfeeeds(tweet_id, user_id,body,status) VALUES (%s, %s, %s, '0')""",
    (tweetid, userid, text))

是的,上述代码与您的代码存在差异; tweetiduseridtext值都作为一个单独的参数(元组)传递给cursor.execute()方法。

游标负责处理要插入数据库的数据的正确转义。这样就可以避免SQL注入攻击(带有;DROP TABLE twitterfeeeds的推文会立即破坏您的数据库),并启用查询计划优化。

这一切都需要您配置数据库连接以支持Unicode数据;在连接上将字符集设置为UTF-8:

conn = MySQLdb.connect(host="localhost", user='root', password='', 
                       db='', charset='utf8')

或更好的是,配置数据库使用UTF8MB4字符集(MySQL使用的UTF-8版本无法处理表情符号或U + FFFF以外的其他代码点):

# Note, no characterset specified
con = MySQLdb.connect(host="localhost", user='root', password='', db='')
cursor = con.cursor()
cursor.execute('SET NAMES utf8mb4')
cursor.execute('SET CHARACTER SET utf8mb4')
cursor.execute('SET character_set_connection=utf8mb4')

答案 1 :(得分:1)

use可以使用MySQLdb.escape_string来转义unicode字符。

>> MySQLdb.escape_string("'")
"\\'"

另外我认为你必须用'use_unicode'打开'mysql.connector':True config:

config = {
'user': ...,
'password': ...,
'host': '127.0.0.1',
'use_unicode':True,
'charset':'utf8',
}
db = mysql.connector.connect(**config)