面對 2000 萬列的 CSV 檔案,如何快速建表並高效匯入?本文記錄完整流程:欄位分析 → PHP 生成建表 SQL → LOAD DATA INFILE 匯入 → BOM 頭處理 → 驗證查詢。
用編輯器開啟 CSV 首行 (Header),統計欄位數與名稱。範例欄位:
Name CardNo Descriot CtfTp CtfId Gender Birthday Address Zip Dirty District1 District2 District3 District4 District5 District6 FirstNm LastNm Duty Mobile Tel Fax EMail Nation Taste Education Company CTel CAddress CZip Family Version id

<?php
$columns_line = "Name CardNo Descriot CtfTp CtfId Gender Birthday Address Zip Dirty District1 District2 District3 District4 District5 District6 FirstNm LastNm Duty Mobile Tel Fax EMail Nation Taste Education Company CTel CAddress CZip Family Version id";
$columns = preg_split("/\s+/", trim($columns_line));
$sql = "CREATE TABLE kf_info (\n";
foreach ($columns as $i => $col) {
$sql .= " `$col` VARCHAR(20) NOT NULL DEFAULT ''";
if ($i < count($columns)-1) $sql .= ",";
$sql .= "\n";
}
$sql .= ") ENGINE=MyISAM DEFAULT CHARSET=utf8;";
echo $sql;
?>
輸出 SQL 直接在 MySQL 執行建表。

LOAD DATA INFILE 'D:/2000W/200W-400W.csv' INTO TABLE kf_info FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n';
關鍵參數:
FIELDS TERMINATED BY ',':欄位分隔符OPTIONALLY ENCLOSED BY '"':欄位可被雙引號包裹ESCAPED BY '"':跳脫字元 (雙引號內的雙引號用兩個雙引號表示)LINES TERMINATED BY '\r\n':Windows 換行符執行報錯:Incorrect string value: '\xEF\xBB\xBF...'。原因:CSV 以 **UTF-8 with BOM** 儲存,前三個位元組 EF BB BF 被當作第一欄資料一部分。

解決: 用編輯器 (Notepad++, VS Code, Sublime) 另存為 **UTF-8 without BOM**,或用指令移除:
# Linux/macOS
sed -i '1s/^\xEF\xBB\xBF//' file.csv
# 或 Python
python -c "open('out.csv','wb').write(open('in.csv','rb').read()[3:])"
移除 BOM 後重新匯入,**成功導入 200 萬列**。

SELECT Name, CtfId, Birthday, Address, Mobile FROM kf_info WHERE Address LIKE '北京市%' AND Gender='F';

ALTER TABLE kf_info DISABLE KEYS; (MyISAM) 關閉索引更新,匯入後 ENABLE KEYS; 重建,大幅加速。innodb_buffer_pool_size、innodb_log_file_size、innodb_flush_log_at_trx_commit=2 (匯入期間) 提升寫入效能。