將圖片、HTML 等二進制文件直接存入 MySQL 資料庫,雖非主流架構(通常建議存檔案系統、資料庫存路徑),但在特定場景(如小型應用、數據完整性要求高、避免文件遺失)下極具價值。本文完整演示:建庫建表、PHP 上傳存儲、讀取顯示三大步驟。
-- 進入 MySQL 控制台
CREATE DATABASE binary_data;
USE binary_data;
CREATE TABLE binary_data (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50),
bin_data LONGBLOB,
filename CHAR(50),
filesize CHAR(50),
filetype CHAR(50)
);
關鍵點: LONGBLOB 支援最大 4GB 二進制數據,滿足大多數文件存儲需求。
<?php
// 連接資料庫配置
$host = 'localhost';
$user = 'root';
$pass = 'password';
$db = 'binary_data';
if (isset($_POST['submit'])) {
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) die('連接失敗: ' . mysqli_connect_error());
// 取得上傳文件資訊
$file = $_FILES['form_data'];
$data = addslashes(file_get_contents($file['tmp_name']));
$name = $file['name'];
$size = $file['size'];
$type = $file['type'];
$desc = $_POST['form_description'];
$sql = "INSERT INTO binary_data (description, bin_data, filename, filesize, filetype)
VALUES ('$desc', '$data', '$name', '$size', '$type')";
if (mysqli_query($conn, $sql)) {
$id = mysqli_insert_id($conn);
echo "<p>檔案已存儲,資料庫 ID: <b>$id</b></p>";
} else {
echo '存儲失敗: ' . mysqli_error($conn);
}
mysqli_close($conn);
} else {
?>
<form method="post" action="" enctype="multipart/form-data">
檔案描述: <br>
<input type="text" name="form_description" size="40"><br>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
選擇檔案: <br>
<input type="file" name="form_data" size="40"><br>
<input type="submit" name="submit" value="上傳存儲">
</form>
<?php } ?>
安全提醒: 實務務必使用 mysqli_real_escape_string 或預處理語句防止 SQL 注入;限制上傳文件類型與大小。
<?php
$host = 'localhost'; $user = 'root'; $pass = 'password'; $db = 'binary_data';
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) die('連接失敗');
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
if ($id > 0) {
$sql = "SELECT bin_data, filetype, filename FROM binary_data WHERE id = $id";
$result = mysqli_query($conn, $sql);
if ($row = mysqli_fetch_assoc($result)) {
header('Content-Type: ' . $row['filetype']);
header('Content-Disposition: inline; filename="' . $row['filename'] . '"');
echo $row['bin_data'];
} else {
echo '找不到指定檔案';
}
}
mysqli_close($conn);
?>
前端調用:<img src="view.php?id=1"> 即可直接顯示資料庫中的圖片。
| 優點 | 缺點 |
|---|---|
| 資料完整性高,備份還原單一文件即可 | 資料庫體積膨脹快,備份/還原耗時長 |
| 避免文件系統權限、路徑、遺失問題 | 大量二進制讀寫影響資料庫效能、連接佔用 |
| 事務一致性:文件與業務數據同進同出 | 不利於 CDN 加速、靜態資源緩存 |
建議: 小型應用、文件較小(<1MB)、數量有限(<10萬)可直接存庫;大型系統建議「物件存儲(S3/MinIO/OSS)+ 資料庫存路徑」架構。
本文提供了 MySQL 存儲二進制文件的完整可執行代碼,涵蓋建表、上傳、讀取全流程。掌握此技能後,您可根據業務場景靈活選擇「存庫」或「存路徑」策略,並在存庫方案中規避 SQL 注入、大文件阻塞等常見坑點。