localhost,端口:3306infosystemgb2312 / gb2312_chinese_ci(若 Excel 含中文,防止亂碼;現代項目建議 utf8mb4/utf8mb4_unicode_ci)| 問題 | 原因 | 解決 |
|---|---|---|
| 中文亂碼 | 數據庫/表字符集非 gb2312/utf8mb4 | 重建表指定正確字符集,或導入前轉碼 Excel 為 UTF-8 |
| 數值存為文本 | Excel 單元格格式為「文本」 | Excel 中全選列 → 數據 → 分列 → 完成,轉為常規/數值 |
| 日期導入錯誤 | Excel 日期格式與 MySQL 不兼容 | 映射步驟手動指定目標類型為 DATE/DATETIME |
| 主鍵衝突 | Excel 含重複 ID | 導入前去重、或目標表不設主鍵改用自增 ID |
| 大文件導入超時 | Navicat 單次事務過大 | 拆分 Excel 分批導入、或用 LOAD DATA INFILE 命令行 |
composer require phpoffice/phpspreadsheet
// 腳本片段
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('data.xlsx');
$sheet = $spreadsheet->getActiveSheet();
foreach ($sheet->getRowIterator(2) as $row) { // 跳過標題行
$data = [];
foreach ($row->getCellIterator() as $cell) {
$data[] = $cell->getValue();
}
// 入庫邏輯...
}
-- 先將 Excel 另存為 CSV (UTF-8)
LOAD DATA INFILE '/path/data.csv'
INTO TABLE target_table
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(col1, col2, col3, @date_col)
SET created_at = STR_TO_DATE(@date_col, '%Y/%m/%d');
Navicat 適合人工、一次性、中小數據量的導入場景,操作門檻低。對於定期、大數據量、自動化需求,建議採用 LOAD DATA INFILE 或 PHP 腳本定時任務。