2013-03-19 88 views
2

我想將包含二進制數據的字符串對象插入到MySQL blob列中。但是,我不斷收到MySQL語法錯誤。在MySQL blob中插入python二進制字符串對象

我爲調試用小腳本:(不是每一次,但...)

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數據庫的自動防故障方式?

回答

8

這樣來做,而不是:

query = '''INSERT INTO cheese (data) VALUES (%s)''' 
cur.execute(query, (bd,)) 

而不是做的Python級字符串格式化的,這種使用MySQL特定的格式,包括具有特殊意義的MySQL在要被嵌入的字符串轉義字符在查詢中。

+0

是的,這似乎工作!我真的不明白基本原則。謝謝! – 2013-03-19 17:32:39

+1

不使用Python級別的字符串格式,而是使用特定於MySQL的格式,包括對嵌入查詢的字符串中具有特殊含義的字符進行轉義。 – djc 2013-03-20 10:23:01

1

該錯誤與字符串的格式化無關,但是與SQL語法無關。 所以我想問題是與SQL查詢本身,而不是字符。 使用query = '''INSERT INTO cheese (data) VALUES ('%s')''' % bd將單個引號中的字符串括起來的地方。

+0

我已經嘗試了不同組合的不同類型的引號,所以這不是問題。 – 2013-03-19 17:33:15

相關問題