首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 存儲圖片 + Qt 讀寫二進制數據實戰 (LONGBLOB 方案)

     編輯:MySQL 綜合教學

資料庫端:建表與寫入

1. 建表 (LONGBLOB 存儲圖片二進制)

CREATE TABLE sfood (
  name VARCHAR(255) NOT NULL PRIMARY KEY,
  type VARCHAR(255) NOT NULL,
  material VARCHAR(255) NOT NULL,
  price INT NOT NULL,
  feature VARCHAR(255) NOT NULL,
  image LONGBLOB  -- 最大 4GB
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

2. SQL 直接導入圖片 (LOAD_FILE)

INSERT INTO sfood (name, type, material, price, feature, image)
VALUES ('生水白菜', '川菜', '白菜,生水', 8, '清淡',
        LOAD_FILE('G:/images/chuancai/baicai.jpg'));
-- Windows 路徑用正斜杠 / 或雙反斜杠 \\\\,Linux 用 /

前提: MySQL 啟用 secure_file_priv='' 或文件在該目錄下;服務進程有讀權限。

Qt 端:讀取並顯示

QSqlQuery query;
query.exec("SELECT * FROM sfood");
if (query.next()) {
    QLabel *picLabel = new QLabel();
    QPixmap photo;
    // 欄位索引 5 對應 image (0-based)
    photo.loadFromData(query.value(5).toByteArray(), "JPG");
    picLabel->setPixmap(photo);
    picLabel->setScaledContents(true); // 自適應縮放
    // 加入佈局顯示...
}

Qt 端:寫入圖片 (參數綁定)

// 1. 檢查是否已存在
query.exec(QString("SELECT * FROM sfood WHERE name='%1'").arg(nameEdit->text()));
if (query.next()) {
    QMessageBox::warning(this, "警告", "該菜已存在");
    return;
}

// 2. 準備插入語句
query.prepare("INSERT INTO sfood (name, type, material, price, feature, image) VALUES (?,?,?,?,?,?)");
query.addBindValue(nameEdit->text());
query.addBindValue(typeEdit->text());
query.addBindValue(materialEdit->toPlainText());
query.addBindValue(priceEdit->text());
query.addBindValue(featureEdit->text());

// 3. 讀取圖片文件為二進制
QString imagePath = QFileDialog::getOpenFileName(this, "選擇圖片", "/home", "Images (*.jpg *.png)");
if (imagePath.isEmpty()) return;

QFile file(imagePath);
if (!file.open(QIODevice::ReadOnly)) return;
QByteArray imgData = file.readAll();
file.close();

// 4. 綁定二進制數據並執行
query.addBindValue(QVariant(imgData));
if (!query.exec()) {
    QMessageBox::critical(this, "錯誤", query.lastError().text());
}

關鍵技術點總結

環節關鍵點
數據類型LONGBLOB (4GB) / MEDIUMBLOB (16MB) / BLOB (64KB) / TINYBLOB (255B)
SQL 導入LOAD_FILE('路徑') 需 secure_file_priv 允許、服務進程可讀
Qt 讀取query.value(index).toByteArray() → QPixmap::loadFromData(data, "格式")
Qt 寫入QFile::readAll() → QByteArray → addBindValue(QVariant(data))
參數綁定預編譯 ? 佔位符,防注入、自動處理二進制轉義
圖片格式loadFromData 第 2 參數指定 "JPG"/"PNG"/"BMP",Qt 自動解碼

避坑指南

  • **大圖片慎存資料庫**:超 1MB 建議存對象存儲 (S3/MinIO/OSS),資料庫只存 URL/路徑,性能與備份更優。
  • LOAD_FILE 失敗返回 NULL,**不報錯**,務必檢查 secure_file_priv 與文件權限。
  • Qt 讀取時 toByteArray() 若字段為 NULL 會返回空數組,需判空。
  • 字符集 gb2312 僅支援中文,**建議全鏈路 utf8mb4**,避免中文欄位亂碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved