MySQL中存储图片方法详解及实例

更新时间:2024-04-20 02:22:45   人气:3328
在数据库系统设计和开发过程中,常常会遇到需要将图像、文档等二进制数据存入到 MySQL 数据库中的需求。本文将会详细解析MySQL中如何有效地存储图片,并通过具体实例来进一步阐述这一过程。

一、BLOB类型

MySQL提供了四种不同大小的Blob(Binary Large Object)字段类型用于储存大容量的数据对象,包括:TINYBLOB(256 bytes),BLOB(64KB), MEDIUMBLOB(16MB) 和 LONGBLOG (4GB),它们都能用来存放如JPEG或PNG格式的图片文件。

例如,在创建一个包含图片列的新表时:

sql

CREATE TABLE Images (
id INT AUTO_INCREMENT PRIMARY KEY,
img_name VARCHAR(20),
image BLOB);


在这个例子中,“image”列为BLOB类型,可用于保存图片内容。

二、插入图片至数据库

为了把一张图片存入上述“Images”表格里,首先需读取该图片为字节流形式,然后用SQL INSERT语句将其插入记录中:

python

# 假设Python环境操作示例:
import mysql.connector as mariadb
from PIL import Image.open

def insert_image(file_path):

# 连接数据库
conn = mariadb.connect(user='username', password='password',
host="localhost",
database="databaseName")

cursor = conn.cursor()

with open(file_path, 'rb') as f:
blob_data = f.read()

sql_query = "INSERT INTO Images(img_name, image) VALUES (%s,%s)"
data_tuple = ('example.jpg', bytearray(blob_data))

cursor.execute(sql_query, data_tuple)

conn.commit() # 提交事务

print("Image inserted successfully.")

conn.close()

这段代码首先打开并以二进制模式('rb' mode)读取指定路径下的图片文件,随后将这些原始字节转换成适合于MySQL处理的形式——在这里是bytearray类型,最后执行SQL命令进行插图入库的操作。

三、从数据库获取并显示图片

取出图片的过程与插入类似,主要涉及查询数据库并将得到的结果还原回原生字节数组后写出为本地图片文件或者直接在网络应用中展示出来:

python

def retrieve_and_save_image(image_id):

conn = mariadb.connect(...) # 同样的连接方式

query = ("SELECT img_name, image FROM Images WHERE id=%s" % str(image_id))

cursor = conn.cursor()
cursor.execute(query)

row = cursor.fetchone()
if not row:
return None

filename=row[0]
imagedata=bytes(row[1])

with open(filename,'wb') as file_to_write:
file_to_write.write(imagedata)

print(f"{filename} has been retrieved and saved.")

conn.close()


总结来说,在MySQL中使用BLOB类型的字段可以方便地实现对图片和其他大型二进制数据的有效管理。然而需要注意的是,尽管这种方式能解决部分场景的需求,但并非所有情况下都推荐这么做。通常出于性能考虑以及分离关注点的原则,大量的静态资源更倾向于储存在专门的对象/云存储服务上,而在数据库仅保留指向实际位置的信息链接。此外,频繁且大量访问这类大数据会导致IO开销增大并对数据库造成较大压力,请结合实际情况权衡选择合适的方案。