You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:31:22