【问题标题】:Insert python binary string object in MySQL blob在 MySQL blob 中插入 python 二进制字符串对象
【发布时间】:2013-03-19 15:53:23
【问题描述】:

我想将包含二进制数据的字符串对象插入 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 数据库的安全方法?

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    改为这样做:

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

    这不是进行 Python 级别的字符串格式化,而是使用 MySQL 特定的格式化,包括在要嵌入查询的字符串中转义对 MySQL 具有特殊意义的字符。

    【讨论】:

    • 是的,这似乎有效!不过,我真的不明白基本原理。谢谢!
    • 不进行 Python 级别的字符串格式化,而是使用 MySQL 特定的格式化,包括在要嵌入查询的字符串中转义对 MySQL 具有特殊意义的字符。
    【解决方案2】:

    该错误与字符串的格式无关,而是与 SQL 语法有关。 所以我猜问题出在 SQL 查询本身,而不是字符。 使用query = '''INSERT INTO cheese (data) VALUES ('%s')''' % bd 将相关字符串用单引号括起来。

    【讨论】:

    • 我已经尝试了不同组合的不同类型的引号,所以这不是问题。
    猜你喜欢
    • 2015-07-22
    • 2015-07-02
    • 2017-10-05
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2011-08-13
    • 2015-03-04
    • 2021-11-09
    相关资源
    最近更新 更多