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;
INSERT INTO sfood (name, type, material, price, feature, image)
VALUES ('生水白菜', '川菜', '白菜,生水', 8, '清淡',
LOAD_FILE('G:/images/chuancai/baicai.jpg'));
-- Windows 路徑用正斜杠 / 或雙反斜杠 \\\\,Linux 用 /
前提: MySQL 啟用 secure_file_priv='' 或文件在該目錄下;服務進程有讀權限。
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); // 自適應縮放
// 加入佈局顯示...
}
// 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 自動解碼 |
LOAD_FILE 失敗返回 NULL,**不報錯**,務必檢查 secure_file_priv 與文件權限。toByteArray() 若字段為 NULL 會返回空數組,需判空。gb2312 僅支援中文,**建議全鏈路 utf8mb4**,避免中文欄位亂碼。