首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL LONGTEXT 存儲大文件(含二進制):C 實現讀寫 650MB ISO 實測

     編輯:MySQL 資料庫相關知識

利用 LONGTEXT(最大 4GB)配合 mysql_real_escape_string 轉義,可將任意二進制文件作為文本存入 MySQL。實測 650MB ISO 文件寫入/讀出完好,關鍵在調大 max_allowed_packet 並分塊處理內存。

核心配置

[mysqld]
max_allowed_packet = 1024M  -- 必須 ≥ 文件大小

重啟 MySQL 生效。

表結構

CREATE DATABASE www;
USE www;
CREATE TABLE www (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    file LONGTEXT
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

關鍵代碼邏輯

  1. stat() 取文件大小 → malloc(size+1) 分配緩衝區。
  2. fread() 讀入內存(大文件建議分塊讀取/寫入,避免 OOM)。
  3. mysql_real_escape_string() 轉義二進制內容(NUL、換行、引號、Control-Z 等)。
  4. 拼裝 INSERT ... VALUES(NULL, 'name', 'escaped_data'),長度 2*size+256。
  5. mysql_real_query() 執行寫入。
  6. 讀出時 SELECT file FROM www WHERE id=1,用 mysql_fetch_lengths() 取真實長度,fwrite() 還原文件。

完關鍵片段

strcpy(sql, "INSERT INTO www(id,name,file) VALUES(NULL,'peter',");
end = sql + strlen(sql);
*end++ = '\'';
end += mysql_real_escape_string(conn, end, buf, n);  // n=文件字節數
*end++ = '\'';
*end++ = ')';
mysql_real_query(conn, sql, end-sql);

避坑指南

  • 內存雙倍:sql 需 2*n 空間,650MB 文件需 ~1.3GB 內存;生產環境請改用 mysql_stmt_send_long_data 分片傳輸(見下篇 LONGBLOB 方案)。
  • max_allowed_packet:客戶端與服務端均需設大,否則報 Packet too large。
  • 字符集:表/連接用 gbk/latin1 均可,關鍵是轉義與還原成對;若用 utf8mb4 需確保轉義函數支持。
  • 事務:大文件寫入建議關閉 autocommit,寫完後 COMMIT,減少 Redo Log 刷盤壓力。

適用場景

小文件(<50MB)、低併發、不想引入對象存儲的簡易業務;大文件/高併發請上 MinIO/S3 + 數據庫存元數據架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved