向MySQL MediumBlob字段插入图片时出现语法错误求助
向MySQL的MediumBlob字段插入图片时出现语法错误
我需要向MySQL的cover表中插入图片,该表包含多个字段,但仅在类型为MediumBlob的datafile字段插入图片时出现错误。
我的代码:
image = open(fileName, 'rb').read() # 以二进制读取模式打开文件 #image = base64.b64encode(image) #image_read = image.read() conn, cursor = Functions.openDB(self, dbname='books') mime = 'image/jpeg' query = "UPDATE `cover` SET `datafile` = %s, WHERE idx = %s " % (image, idx ) try: cursor.execute(query) conn.commit() except Error as e: Functions.handle_error(self, message=e) self.container.close()
错误信息:
Syntax error: near 'xffxd8xffxe0x00x10JFIFx00x01x01x01x00'x00'x00x00xffxdbx00Cx00' at line 1
无论直接读取二进制文件还是读取后进行Base64编码,都会出现语法错误,仅错误提示字符串有所不同。我在网上搜索到的基本都是类似上述的代码,但部分建议并不适用,原因如下:
- 我遇到的是语法错误,推测是编码方式无法被MySQL识别导致的
- 这些建议多针对字符串或整数操作,而我的问题是向Blob字段插入图片
- 我所有数据库访问脚本的语法结构都是正确的
解决方法
问题根源有两个:一是直接用字符串格式化把二进制数据拼进SQL语句,二进制里的特殊字符会破坏SQL语法;二是原SQL语句中SET后面多了一个多余的逗号。
修改后的正确代码:
image = open(fileName, 'rb').read() # 以二进制读取模式打开文件 conn, cursor = Functions.openDB(self, dbname='books') # 移除多余逗号,使用参数占位符,不直接拼接数据到SQL query = "UPDATE `cover` SET `datafile` = %s WHERE idx = %s" try: # 将参数作为execute的第二个参数传入,让驱动自动处理转义 cursor.execute(query, (image, idx)) conn.commit() except Error as e: Functions.handle_error(self, message=e) self.container.close() finally: # 新增资源释放操作,避免连接泄漏 cursor.close() conn.close()
关键注意事项:
- 绝对不要用字符串格式化拼接SQL语句,既会引发语法错误,还存在SQL注入风险
- 参数化查询会自动处理二进制数据的编码和转义,完美适配Blob字段的写入需求
- 一定要检查SQL语句的语法细节,比如多余的逗号这类低级错误
内容的提问来源于stack exchange,提问作者Its Me
相关产品推荐
相关产品推荐

