MySQL數(shù)據(jù)庫中存儲(chǔ)圖片和讀取圖片的操作代碼
方法一:將圖片以 BLOB 類型存儲(chǔ)在數(shù)據(jù)庫中
MySQL 語句實(shí)現(xiàn)
- 創(chuàng)建表:
首先,你需要在 MySQL 中創(chuàng)建一個(gè)包含 BLOB 字段的表來存儲(chǔ)圖片。
CREATE TABLE images (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
image LONGBLOB NOT NULL
);
- 插入圖片:
假設(shè)你已經(jīng)有了圖片數(shù)據(jù)(可能是從文件讀取的二進(jìn)制數(shù)據(jù)),你可以使用INSERT INTO ... VALUES語句來插入圖片。
INSERT INTO images (name, image) VALUES ('example.jpg', LOAD_FILE('/path/to/example.jpg'));
注意:LOAD_FILE() 函數(shù)要求 MySQL 服務(wù)器對(duì)指定路徑有讀取權(quán)限,且該路徑必須在 MySQL 服務(wù)器的 secure_file_priv 變量指定的目錄中(如果啟用了該變量)。
- 讀取圖片:
要從數(shù)據(jù)庫中讀取圖片,你可以使用 SELECT 語句,并在應(yīng)用程序中處理返回的二進(jìn)制數(shù)據(jù)。
SELECT image FROM images WHERE id = 1;
要檢索圖片數(shù)據(jù)并將其保存為文件,你可以使用SELECT語句和INTO OUTFILE:
SELECT image FROM images WHERE id = 1 INTO OUTFILE '/path/to/your/output.jpg';
注意:使用LOAD_FILE()和INTO OUTFILE需要相應(yīng)的文件系統(tǒng)權(quán)限。此外,對(duì)于大型二進(jìn)制數(shù)據(jù),請(qǐng)考慮性能影響,因?yàn)锽LOB數(shù)據(jù)類型可能會(huì)影響數(shù)據(jù)庫性能。
Python 實(shí)現(xiàn)
插入圖片:
import mysql.connector
# 連接到數(shù)據(jù)庫
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
cursor = conn.cursor()
# 讀取圖片文件
with open('/path/to/example.jpg', 'rb') as file:
binary_data = file.read()
# 插入圖片到數(shù)據(jù)庫
sql = "INSERT INTO images (name, image) VALUES (%s, %s)"
val = ('example.jpg', binary_data)
cursor.execute(sql, val)
conn.commit()
# 關(guān)閉連接
cursor.close()
conn.close()
讀取圖片:
import mysql.connector
from io import BytesIO
from PIL import Image
# 連接到數(shù)據(jù)庫
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
cursor = conn.cursor()
# 從數(shù)據(jù)庫中讀取圖片
sql = "SELECT image FROM images WHERE id = 1"
cursor.execute(sql)
result = cursor.fetchone()
image_data = result[0]
# 使用 PIL 庫顯示圖片
image = Image.open(BytesIO(image_data))
image.show()
# 關(guān)閉連接
cursor.close()
conn.close()
方法二:將圖片存儲(chǔ)在文件系統(tǒng)中,并在數(shù)據(jù)庫中存儲(chǔ)路徑
MySQL 語句實(shí)現(xiàn)
- 創(chuàng)建表:
創(chuàng)建一個(gè)只包含圖片路徑或 URL 的表。
CREATE TABLE images (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
path VARCHAR(255) NOT NULL
);
- 插入圖片路徑:
當(dāng)圖片文件被保存到文件系統(tǒng)后,將其路徑插入到數(shù)據(jù)庫中。
INSERT INTO images (name, path) VALUES ('example.jpg', '/path/to/example.jpg');
- 讀取圖片路徑:
從數(shù)據(jù)庫中讀取圖片路徑,并使用該路徑在文件系統(tǒng)中訪問圖片。
SELECT path FROM images WHERE id = 1;
- 注意:使用LOAD_FILE()和INTO OUTFILE需要相應(yīng)的文件系統(tǒng)權(quán)限。此外,對(duì)于大型二進(jìn)制數(shù)據(jù),請(qǐng)考慮性能影響,因?yàn)锽LOB數(shù)據(jù)類型可能會(huì)影響數(shù)據(jù)庫性能。
Python 實(shí)現(xiàn)
保存圖片到文件系統(tǒng)并插入路徑:
import os
import mysql.connector
# 連接到數(shù)據(jù)庫
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
cursor = conn.cursor()
# 保存圖片到文件系統(tǒng)
file_path = '/path/to/save/example.jpg'
with open('/path/to/example.jpg', 'rb') as source_file:
with open(file_path, 'wb') as dest_file:
dest_file.write(source_file.read())
# 插入圖片路徑到數(shù)據(jù)庫
sql = "INSERT INTO images (name, path) VALUES (%s, %s)"
val = ('example.jpg', file_path)
cursor.execute(sql, val)
conn.commit()
# 關(guān)閉連接
cursor.close()
conn.close()
讀取圖片路徑并顯示圖片:
import mysql.connector
from PIL import Image
# 連接到數(shù)據(jù)庫
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database'
)
cursor = conn.cursor()
# 從數(shù)據(jù)庫中讀取圖片路徑
sql = "SELECT path FROM images WHERE id = 1"
cursor.execute(sql)
result = cursor.fetchone()
image_path = result[0]
# 使用 PIL 庫顯示圖片
image = Image.open(image_path)
image.show()
# 關(guān)閉連接
cursor.close()
conn.close()
總結(jié)
- BLOB 存儲(chǔ):適合存儲(chǔ)小圖片或需要保持?jǐn)?shù)據(jù)完整性的場(chǎng)景,但可能會(huì)增加數(shù)據(jù)庫的大小和備份復(fù)雜性。
- 文件系統(tǒng)存儲(chǔ):適合存儲(chǔ)大圖片或需要頻繁訪問的場(chǎng)景,可以減少數(shù)據(jù)庫負(fù)載,但需要確保文件系統(tǒng)的可用性和安全性。
選擇哪種方法取決于具體的應(yīng)用場(chǎng)景和需求。
以上就是MySQL數(shù)據(jù)庫中存儲(chǔ)圖片和讀取圖片的操作代碼的詳細(xì)內(nèi)容,更多關(guān)于MySQL存儲(chǔ)和讀取圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL數(shù)據(jù)庫表的合并與分區(qū)實(shí)現(xiàn)介紹
今天我們來聊聊處理大數(shù)據(jù)時(shí)Mysql的存儲(chǔ)優(yōu)化。當(dāng)數(shù)據(jù)達(dá)到一定量時(shí),一般的存儲(chǔ)方式就無法解決高并發(fā)問題了。最直接的MySQL優(yōu)化就是分區(qū)分表,以下是我個(gè)人對(duì)分區(qū)分表的筆記2022-09-09
mysql報(bào)錯(cuò)ERROR 1396 (HY000): Operation ALT
這篇文章主要給大家介紹了關(guān)于mysql報(bào)錯(cuò)ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost的解決方式,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-05-05
mysql中全連接full join...on...的用法說明
這篇文章主要介紹了mysql中全連接full join...on...的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
MySQL的主從復(fù)制步驟詳解及常見錯(cuò)誤解決方法
這篇文章主要介紹了MySQL的主從復(fù)制步驟詳解及常見錯(cuò)誤解決方法,文中主張同步時(shí)跳過臨時(shí)錯(cuò)誤,并對(duì)Slave_IO_Running: No錯(cuò)誤的解決給出了方案,需要的朋友可以參考下2016-02-02
Mysql遷移DM國(guó)產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫完整步驟記錄
最近工作中用到國(guó)產(chǎn)數(shù)據(jù)庫達(dá)夢(mèng),簡(jiǎn)稱DM,下面這篇文章主要給大家介紹了關(guān)于Mysql遷移DM國(guó)產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫完整步驟的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07

