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
相关产品推荐
相关产品推荐

