无法通过Python通过存储过程mysql插入blob图像

3

我正在尝试使用存储过程将图像插入到mysql中的blob列中。

Python代码:

from mysql.connector import pooling

conn_pool = pooling.MySQLConnectionPool(pool_name="PipelinePool", pool_size=5, **DB_CONFIG)
conn = conn_pool.get_connection()
cursor = conn.cursor()

with open('test.jpg', 'rb') as image_file:
    image = image_file.read()
    cursor.callproc('INSERT_IMG', args=(image))
    conn.commit()

cursor.callproc('INSERT_IMG', args=(image)) 但是这一行会产生一个错误:

mysql.connector.errors.InterfaceError: 调用存储过程失败;'utf8'编解码器无法在位置0处解码字节0xff:无效的起始字节

存储过程代码:

CREATE PROCEDURE `INSERT_IMG` (IN _image BLOB)
BEGIN
    INSERT INTO some_table (IMAGE) VALUE (_image);
END

为什么针对一个简单的 INSERT 语句你要编写存储过程? - tadman
你需要使用BINARY编码来提供图像。UTF-8不起作用。你可以尝试将其转换为十六进制编码,如MySQL表示法,这样可以完全避免二进制问题。请记住,在数据库中存储大块的二进制数据通常会带来很多麻烦,应该尽量避免。 - tadman
1个回答

0

问题已解决。感谢 tadman 的评论。

我需要将十六进制字符串作为参数发送。

from mysql.connector import pooling
import binascii

conn_pool = pooling.MySQLConnectionPool(pool_name="PipelinePool", pool_size=5, **DB_CONFIG)
conn = conn_pool.get_connection()
cursor = conn.cursor()

with open('test.jpg', 'rb') as image_file:
    image = image_file.read()
    cursor.callproc('INSERT_IMG', args=(binascii.hexlify(image)))
    conn.commit()

然后在存储过程中,我使用UNHEX()将十六进制字符串转换为二进制。

CREATE PROCEDURE `INSERT_IMG` (IN _image BLOB)
BEGIN
    INSERT INTO some_table (IMAGE) VALUE (UNHEX(_image));
END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接