關於MySQL中使用LOAD DATA INFILE匯入csv檔案時的日期格式問題

weixin_33896726發表於2016-02-04

在使用MySQL時,常常會用到Load Data Infile來匯入資料,在遇到Date型別的列時,有時會遇到格式轉換的問題:

首先建立一張簡單的people表,包含名字,生日,年齡三個欄位:
mysql> create table people(
    -> name varchar(10) NOT NULL,
    -> birthday date NOT NULL,
    -> age int NOT NULL);
Query OK, 0 rows affected (0.18 sec)
構造兩個測試檔案,匯入到people表中,如下圖:
關於MySQL中使用LOAD <wbr>DATA <wbr>INFILE匯入csv檔案時的日期格式問題
可以看到兩個檔案僅有生日的格式不同,我們對兩個檔案分別用load data local infile進行匯入測試,結果如下:
關於MySQL中使用LOAD <wbr>DATA <wbr>INFILE匯入csv檔案時的日期格式問題
關於MySQL中使用LOAD <wbr>DATA <wbr>INFILE匯入csv檔案時的日期格式問題
可以看到test1.txt中的形如%Y-%m-%d格式的日期可以被正確匯入,而test2.txt中的形如%m/%d/%Y格式的日期無法被正確匯入,提示資料被截斷。
 
檢查一下與date有關的系統變數如下:
關於MySQL中使用LOAD <wbr>DATA <wbr>INFILE匯入csv檔案時的日期格式問題
發現mysql中date_format的預設值是%Y-%m-%d,嘗試修改該變數的值,返回如下錯誤:
mysql> set date_format='%m/%d/%Y';
ERROR 1238 (HY000): Variable 'date_format' is a read only variable
那麼我們直接在配置檔案my.ini中設定該值,重啟mysql服務,成功修改了date_format的值:
關於MySQL中使用LOAD <wbr>DATA <wbr>INFILE匯入csv檔案時的日期格式問題
重新匯入test2.txt,本以為可以正常匯入,結果卻和原來一樣,連顯示格式都沒有變:
mysql> select * from people;
+------+------------+-----+
| name | birthday   | age |
+------+------------+-----+
| Lily | 0000-00-00 |  25 |
| Lucy | 0000-00-00 |  23 |
+------+------------+-----+
2 rows in set (0.00 sec)
百度一下據說這個變數已經被mysql拋棄了…………
 
那麼問題來了,如何正確匯入非預設格式的date資料呢?
嘗試了一下大概有三個辦法:
1.使用編輯軟體將csv檔案中的日期格式轉換成mysql預設的日期格式,然後再匯入;
2.使用某些第三方軟體進行匯入,如navicat,自帶日期格式轉換功能;
3.在load data local infile語句中使用STR_TO_DATE函式進行轉換:
關於MySQL中使用LOAD <wbr>DATA <wbr>INFILE匯入csv檔案時的日期格式問題
個人推薦使用第三種方法,實際測試命令列下匯入資料比通過客戶端軟體匯入速度快太多了。

相關文章