将Python二进制字符串对象插入MySQL BLOB
我想把一个包含二进制数据的字符串对象放进MySQL的blob列里。但是,我总是遇到MySQL的语法错误。
为了调试,我写了一个小脚本:
import MySQLdb
import array
import random
conn = MySQLdb.connect(host="localhost", user="u", passwd="p", db="cheese")
cur = conn.cursor()
a = array.array('f')
for n in range(1,5):
a.append(random.random())
bd = a.tostring()
print type(bd) # gives str
query = '''INSERT INTO cheese (data) VALUES (%s)''' % bd
cur.execute(query)
结果(但不是每次都这样...)
ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '?fJ\x95<=
\xad9>\xf3\xec\xe5>)' at line 1")
问题似乎是因为二进制数据中有一些MySQL不喜欢的字符。那么,有没有什么安全的方法可以把二进制数据放进MySQL数据库呢?
2 个回答
1
这个错误跟字符串的格式没关系,而是跟SQL语法有关。所以我猜问题出在SQL查询本身,而不是字符上。你可以用 query = '''INSERT INTO cheese (data) VALUES ('%s')''' % bd
这种写法,把你要插入的字符串用单引号包起来。
13
这样做更好:
query = '''INSERT INTO cheese (data) VALUES (%s)'''
cur.execute(query, (bd,))
这里不是用Python的字符串格式化,而是使用了MySQL特有的格式化方式。这种方式会处理一些在MySQL中有特殊含义的字符,以确保它们在查询中嵌入时不会出错。