Python 2.7读写MySQL Blob数据格式不一致问题求助
Python2.7操作MySQL Blob:恢复原二进制格式的解决办法
这个问题我之前在Python2.7操作MySQL Blob的时候也碰到过,核心问题是Python2里str(字节串)和unicode(文本串)的区别,加上MySQL驱动的默认设置搞的鬼,我给你一步步拆解解决办法:
问题根源
MySQL的Blob列存的是纯二进制字节,但Python2的MySQL驱动(比如常用的MySQLdb)默认会把Blob数据转成Unicode字符串返回,这就导致你看到的u'前缀;同时原数据里的\x字节转义被当成了Unicode字符的码点处理,自然就消失了,数据格式也就乱了。
解决步骤
1. 写入时确保用字节串(str类型)
Python2里str就是原生字节串,写入Blob前一定要保证你的数据是str类型,别传unicode进去——否则驱动会自动用默认编码(比如utf-8)把Unicode转成字节,破坏原二进制结构。
如果你的data_list里是Unicode字符串,转成字节串可以用latin-1编码(它是单字节映射,不会改变字节值):
# 假设原unicode数据是 u'\x01\x02\x03' binary_data = unicode_data.encode('latin-1') # 转成str类型的字节串 '\x01\x02\x03'
写入的示例代码:
import MySQLdb # 连接数据库时尽量加上 use_unicode=False,强制用字节串处理 conn = MySQLdb.connect( host='你的主机', user='用户名', passwd='密码', db='数据库名', use_unicode=False ) cursor = conn.cursor() # 直接传入str类型的二进制数据 cursor.execute("INSERT INTO 表名 (blob列名) VALUES (%s)", (binary_data,)) conn.commit()
2. 读取时强制返回字节串
读取的时候要让驱动别把Blob转成Unicode,有两种方式:
方式一:连接时设置use_unicode=False
像上面的连接代码那样,设置后查询返回的Blob数据直接是str类型,带\x转义,没有u'前缀:
cursor.execute("SELECT blob列名 FROM 表名 WHERE id = %s", (1,)) result = cursor.fetchone() if result: retrieved_data = result[0] print(type(retrieved_data)) # 输出 <type 'str'> print(repr(retrieved_data)) # 显示 '\x01\x02\x03\x04',和原格式一致
方式二:查询时用CAST转换
如果已经建立了连接没法改参数,可以在SQL里把Blob列转成二进制类型:
cursor.execute("SELECT CAST(blob列名 AS BINARY) FROM 表名 WHERE id = %s", (1,)) retrieved_data = cursor.fetchone()[0] # 同样得到str类型的原二进制数据
关键注意点
- 永远不要直接把
unicode字符串写入Blob列,编码转换会破坏二进制数据的字节结构 - 读取后用
repr()查看数据格式,它会显示出\x转义,方便你确认和原数据一致
内容的提问来源于stack exchange,提问作者user3440012
相关产品推荐
相关产品推荐

