背景
導入一些csv數據到Mysql,記錄一下過程中出現的問題
數據源
csv文件的數據源爲Sql Server,使用Sql Server導出csv文件的過程就不在贅述,過程中出現的問題如下:
正在驗證 (錯誤) 消息 錯誤 0xc020802e: 數據流任務: “輸入列“C301”(123)”的數據類型爲
DT_NTEXT,ANSI 文件不支持此數據類型。請改用 DT_TEXT,然後使用數據轉換組件將數據轉換爲 DT_NTEXT。 (SQL
Server 導入和導出嚮導)錯誤 0xc004706b: 數據流任務: “組件“目標 - 1_TXT”(91)”驗證失敗,返回的驗證狀態爲“VS_ISBROKEN”。
(SQL Server 導入和導出嚮導)錯誤 0xc004700c: 數據流任務: 一個或多個組件未能通過驗證。 (SQL Server 導入和導出嚮導)
錯誤 0xc0024107: 數據流任務: 任務驗證期間出錯。 (SQL Server 導入和導出嚮導)
出現這樣的問題爲字段類型兼容的問題,要在導入爲csv時勾選unicode,這樣就不會出現這樣的錯誤
LOAD DATA INFILE
將csv文件導入mysql,我們使用LOAD DATA INFILE的方式,這種方式導入的速度很快。LOAD DATA INFILE的使用方式將會另外的博客中進行介紹。下面主要介紹在使用的過程中遇到的錯誤:
secute-file-priv
ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement
這個是mysql爲了保護數據安全性的設定,secute-file-priv這個參數來限制數據的導入和導出的效果,在執行LOAD DATA、SELECT … INTO OUTFILE等語句時,需要用戶具有file的權限。
- secute-file-priv爲空,這個變量沒有效果,允許任意的導入和導出的操作
- secute-file-priv設爲一個目錄名,MySQL服務只允許在這個目錄中執行文件的導入和導出操作。這個目錄必須存在,MySQL服務不會創建它;
- secute-file-priv爲NULL,MySQL服務會禁止導入和導出操作。這個參數在MySQL 5.7.6版本引入
我們可以在mysql下執行如下命令查看當前secute-file-priv的狀態:
show variables like '%secure%';
下圖爲當前的狀態,我們可以把需要導入的文件放在/var/lib/mysql-files,這樣便可以進行數據的導入操作了
Invalid utf8 character string
ERROR 1300 (HY000): Invalid utf8 character string: ”
出現這樣的錯誤,爲導入的csv格式中有不符合utf8的類型的數據
我們去查看csv文件的數據類型,使用如下的指令:
file XXX.csv
我們發現該文件的編碼格式爲UTF-16,後續我們將會對csv文件的編碼進行更改,使其適應我們設定的數據格式
linux下更改csv文件編碼格式,我們使用iconv進行操作。
iconv FactOrder_1w.csv -f UTF-16 -t UTF-8 -o FactOrder_utf8.csv
格式爲
iconv 文件名 -f 初始文件編碼 -t 目標文件編碼 -o 目標文件名
更改之後我們再使用file去查看文件格式,發現該csv文件的編碼格式已經發生了變化,變成了utf-8