MySQL數(shù)據(jù)庫中存儲圖片和讀取圖片的操作代碼
方法一:將圖片以 BLOB 類型存儲在數(shù)據(jù)庫中
MySQL 語句實現(xiàn)
- 創(chuàng)建表:
首先,你需要在 MySQL 中創(chuàng)建一個包含 BLOB 字段的表來存儲圖片。
CREATE TABLE images ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, image LONGBLOB NOT NULL );
- 插入圖片:
假設(shè)你已經(jīng)有了圖片數(shù)據(jù)(可能是從文件讀取的二進制數(shù)據(jù)),你可以使用INSERT INTO ... VALUES
語句來插入圖片。
INSERT INTO images (name, image) VALUES ('example.jpg', LOAD_FILE('/path/to/example.jpg'));
注意:LOAD_FILE() 函數(shù)要求 MySQL 服務(wù)器對指定路徑有讀取權(quán)限,且該路徑必須在 MySQL 服務(wù)器的 secure_file_priv 變量指定的目錄中(如果啟用了該變量)。
- 讀取圖片:
要從數(shù)據(jù)庫中讀取圖片,你可以使用 SELECT 語句,并在應(yīng)用程序中處理返回的二進制數(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)限。此外,對于大型二進制數(shù)據(jù),請考慮性能影響,因為BLOB數(shù)據(jù)類型可能會影響數(shù)據(jù)庫性能。
Python 實現(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()
方法二:將圖片存儲在文件系統(tǒng)中,并在數(shù)據(jù)庫中存儲路徑
MySQL 語句實現(xiàn)
- 創(chuàng)建表:
創(chuàng)建一個只包含圖片路徑或 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)限。此外,對于大型二進制數(shù)據(jù),請考慮性能影響,因為BLOB數(shù)據(jù)類型可能會影響數(shù)據(jù)庫性能。
Python 實現(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 存儲:適合存儲小圖片或需要保持?jǐn)?shù)據(jù)完整性的場景,但可能會增加數(shù)據(jù)庫的大小和備份復(fù)雜性。
- 文件系統(tǒng)存儲:適合存儲大圖片或需要頻繁訪問的場景,可以減少數(shù)據(jù)庫負(fù)載,但需要確保文件系統(tǒng)的可用性和安全性。
選擇哪種方法取決于具體的應(yīng)用場景和需求。
以上就是MySQL數(shù)據(jù)庫中存儲圖片和讀取圖片的操作代碼的詳細內(nèi)容,更多關(guān)于MySQL存儲和讀取圖片的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL InnoDB架構(gòu)的相關(guān)總結(jié)
InnoDB存儲引擎架構(gòu)作為MySQL最常用的存儲引擎,每個后端程序員都應(yīng)有所了解,本文將具體講述MySQL InnoDB架構(gòu)的相關(guān)知識,感興趣的朋友可以參考下2021-05-05MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析
這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析,并通過實例給大家例句的問題處理辦法,需要的朋友參考學(xué)習(xí)下。2017-12-12SQL中from_unixtime函數(shù)的使用方法實例
在MySQL數(shù)據(jù)表設(shè)計中,時間字段一般都設(shè)計為時間戳格式的,開發(fā)人員去查看的時候就顯得有點不方便,可以使用FROM_UNIXTIME轉(zhuǎn)換成日期格式進行查看,下面這篇文章主要給大家介紹了關(guān)于SQL中from_unixtime函數(shù)的使用方法的相關(guān)資料,需要的朋友可以參考下2022-08-08以數(shù)據(jù)庫字段分組顯示數(shù)據(jù)的sql語句(詳細介紹)
本篇文章是對以數(shù)據(jù)庫字段分組顯示數(shù)據(jù)的sql語句進行了詳細的分析介紹,需要的朋友參考下2013-06-06MySQL系列之十 MySQL事務(wù)隔離實現(xiàn)并發(fā)控制
今天的內(nèi)容就和大家聊一聊MySQL數(shù)據(jù)庫中關(guān)于MySQL事務(wù)隔離實現(xiàn)并發(fā)控制的問題,主要是基于鎖實現(xiàn)控制技術(shù)2021-07-07mysql中key 、primary key 、unique key 與index區(qū)別
這篇文章主要介紹了mysql中key 、primary key 、unique key 與index區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-10-10mysql導(dǎo)入導(dǎo)出數(shù)據(jù)的示例詳解
本文主要介紹了MySQL 導(dǎo)出和導(dǎo)入數(shù)據(jù)的幾種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05