概要寫法:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘file_name.csv’
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY ‘string’]
[[OPTIONALLY] ENCLOSED BY ‘char’]
[ESCAPED BY ‘char’]
]
[LINES
[STARTING BY ‘string’]
[TERMINATED BY ‘string’]
]
[IGNORE number LINES]
[(col_name_or_user_var,….)]
[SET col_name=expr,…)]
具體語法使用可參照:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#load-data
如果一個表中只有英文字符則導入不出現(xiàn)問題,寫法也極其簡單:
LOAD DATA LOCAL INFILE ‘D:ports.csv’ INTO TABLE ports;
遇到的問題一:ports.csv文件中存在中文字符,導入數(shù)據(jù)后變成亂碼!
我的解決方法是:
首先修改表及字段的編碼方式:
alter table ports character set gbk2312;
alter table ports modify port_chinese varchar(50) character set gbk2312;
通過 show create table ports 查看表及字段的編碼方式,當然也可以通過可視化工具修改字段的編碼格式
但我修改以上兩項之后我導入數(shù)據(jù)依舊亂碼,我的CSV文件編碼格式是GBK,
我導入的命令行具體寫法是:
LOAD DATA LOCAL INFILE ’D:ports.csv’ INTO TABLE ports FIELDS TERMINATED ‘,' ENCLOSED BY ‘”’ LINES TERMINATED BY ‘’ starting by’’;
在網(wǎng)絡(luò)上找到一篇關(guān)于此問題的文章:http://www.sqlstudy.com/sql_article.php?id=2008081901,借鑒于文章中的寫法修改語句如下:
LOAD DATA LOCAL INFILE ’D:ports.csv’ INTO TABLE ports character set gbk2312 FIELDS TERMINATED ‘,' ENCLOSED BY ‘”’ LINES TERMINATED BY ‘’ starting by ’’;
至此亂碼變成了正確的中文字符。
遇到的問題二:在導入數(shù)據(jù)后查看數(shù)據(jù)時發(fā)現(xiàn)CSV文件中第一行有效數(shù)據(jù)丟失,而多出三行怪異的無效數(shù)據(jù)行,而且在執(zhí)行導入命令時有39個警告。
我的解決方法:
首先我使用SHOW WARNINGS;命令查看提示的警告內(nèi)容,發(fā)現(xiàn)CSV文件中的列標題導入數(shù)據(jù)庫中出現(xiàn)了N多警告,而出現(xiàn)數(shù)據(jù)錯誤的關(guān)鍵原因在 LINES TERMINATED BY ‘’ 這句中,因為第一行列標題并沒有以回車換行字符結(jié)束,第一行標題列在轉(zhuǎn)換過程出錯,也導致了第一行有效數(shù)據(jù)在導入過程中出現(xiàn)錯誤。我將csv文件中文件標題的最后一列標題加上一回車后保存數(shù)據(jù),CSV中的第一行有效數(shù)據(jù)終于導入到數(shù)據(jù)中,但卻多一行標題行數(shù)據(jù),通過IGNORE命令可解決。
最后的CSV導入命令行的寫法:
LOAD DATA LOCAL INFILE ’D:ports.csv’ INTO TABLE ports character set gbk2312 FIELDS TERMINATED ‘,' ENCLOSED BY ‘”’ LINES TERMINATED BY ‘’ starting by ’’ IGNORE 1 LINES;