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

Python+MySQLdb:字节字符串存入BLOB字段失败问题排查

为啥字节字符串插入BLOB字段会失败?看这篇就懂!

哈哈,太懂这种气得想摔电脑的憋屈感了!我来给你把这事掰明白,顺便给你解决办法。

问题根源:字符串格式化坑了字节串

你用'%s'来格式化SQL语句的方式,对普通字符串a能凑活,但对字节串b完全不适用:

  • 当你格式化普通字符串a时,Python会把它转成SQL能识别的字符串字面量,数据库接收后能正常处理(甚至自动转成BLOB格式,取决于数据库配置)。
  • 但字节串b不一样!当你用'%s'格式化它时,Python会把字节串转换成它的字符串表示形式——比如b'byteexample'会变成字符串"b'byteexample'",带着那个讨厌的b前缀和引号!数据库的BLOB字段要的是原始字节流,不是这种“描述字节串的文本”,自然会报错。

而且更重要的是:用字符串格式化拼接SQL是高危操作,会导致SQL注入漏洞,哪怕是普通字符串也不推荐这么干!

正确姿势:用参数化查询

所有正经的Python数据库驱动(比如sqlite3、psycopg2、pyodbc)都支持参数化查询,这才是插入BLOB的正确打开方式。驱动会自动帮你处理字节串到BLOB的转换,还能避免SQL注入。

举几个常用数据库的例子:

1. SQLite

# 用?作为参数占位符
sql = "INSERT INTO justatable(ablob) VALUES (?)"
cursor.execute(sql, (b,))  # 直接把字节串作为参数传进去

2. PostgreSQL(psycopg2)

# 用%s作为参数占位符(注意这不是字符串格式化的%s!)
sql = "INSERT INTO justatable(ablob) VALUES (%s)"
cursor.execute(sql, (b,))

3. MySQL(mysql-connector)

sql = "INSERT INTO justatable(ablob) VALUES (%s)"
cursor.execute(sql, (b,))

不管是普通字符串还是字节串,都应该用这种参数化的方式,既安全又能避免格式问题。

内容的提问来源于stack exchange,提问作者adku1173

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:32