Mysql加載本地CSV文件
1.系統環境
- 系統版本:Win10 64位
- Mysql版本: 8.0.15 MySQL Community Server - GPL
- Mysql Workbench版本:Version 8.0.15 build(64bits) Community
2.准備工作
不管是使用Workbench還是命令行來加載本地數據,都可以先使用Workbench進行數據庫、表的創建工作。
3.使用Workbench進行加載
- 當數據量不是很大時(萬級以內)時,可以使用Workbench進行加載,優點是可以根據引導一步一步操作。
- 操作過程中碰到的問題:進入引導界面並選擇待加載的文件后,軟件提示Unhandled exception:("Incorrect database name"",1102),直接指示數據庫名為空,並且報錯。原因是將需要將當前數據庫設置為默認數據庫(右鍵當前數據庫然后選擇Set as Default Scheme),不然Workbench會找不到默認數據庫,從而報一個數據庫名為空的錯誤。
- 剩下的步驟根據指示完成即可。
4.使用命令行進行加載
4.1 命令語法
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [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,...)]
load data infile語句從一個文本文件中以很高的速度讀入一個表中。使用這個命令之前,mysqld進程(服務)必須已經在運行。由於安全原因,當讀取位於服務器上的文件時,文件必須處於數據庫目錄或可被所有人讀取。另外,為了對服務器上文件使用load data infile,在服務器主機上必須有file的權限。
- 如果指定關鍵詞low_priority,那么MySQL將會等到沒有其他人讀這個表的時候,才把數據插入。可以使用如下的命令:
load data low_priority infile "/home/mark/data sql" into table Orders;
- 如果指定local關鍵詞,則表明從客戶主機讀文件。如果local沒指定,文件必須位於服務器上。
- replace和ignore關鍵詞控制對現有的唯一鍵記錄的重復的處理。如果你指定replace,新行將代替有相同的唯一鍵值的現有行。如果你指定ignore,跳過有唯一鍵的現有行的重復行的輸入。如果你不指定任何一個選項,當找到重復鍵時,出現一個錯誤,並且文本文件的余下部分被忽略。例如:
load data low_priority infile "/home/mark/data sql" replace into table Orders;
- 分隔符:
- fields關鍵字指定了文件字段的分割格式,如果用到這個關鍵字,MySQL剖析器希望看到至少有下面的一個選項:
- terminated by:以什么字符作為分隔符
- enclosed by:字段閉合標簽
- escaped by:轉義字符
- terminated by:描述字段的分隔符,默認情況下是tab字符(\t)
- enclosed by:描述的是字段的括起字符
- escaped by:描述的轉義字符。默認的是反斜杠(backslash:\ )
- lines 關鍵字指定了每條記錄的分隔符默認為'\n'即為換行符:
- 如果兩個字段都指定了,那fields必須在lines之前。如果不指定fields關鍵字,缺省值與這樣寫相同:fields terminated by'\t' enclosed by ’ '' ‘ escaped by'\\'
- 如果你不指定一個lines子句,缺省值與這樣寫的相同: lines terminated by'\n'
- [IGNORE number LINES] 忽略特定行數,CSV文件可以忽略掉第一行標題
- fields關鍵字指定了文件字段的分割格式,如果用到這個關鍵字,MySQL剖析器希望看到至少有下面的一個選項:
4.2 操作過程中的問題
運行如下代碼:
mysql> LOAD DATA LOCAL INFILE 'D:/XXX.csv' INTO TABLE database.tablename FIELDS TERMINATED BY ',';
出現如下錯誤:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
原因是服務器端,local_infile默認開啟;客戶端,local_infile默認關閉,因此用的時候需要打開。
查看local_infile變量的狀態:
mysql> show global variables like 'local_infile'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | local_infile | OFF | +---------------+-------+
顯示為關閉狀態,使用如下命令打開:
mysql> set global local_infile = 'ON';
並再次查看:
mysql> show global variables like 'local_infile'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | local_infile | ON | +---------------+-------+
然后再進行導入工作:
mysql> LOAD DATA LOCAL INFILE 'D:/XXX.csv' INTO TABLE database.tablename FIELDS TERMINATED BY ',';
仍然報同樣的錯誤:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
退出mysql,用如下命令進行登陸:
$ mysql --local-infile=1 -u root -p
然后就能夠正常進行正常加載了:
mysql> load data local infile 'E:/Documents/user_utf.csv' into table data.user fields terminated by ','; Query OK, 101535 rows affected, 65535 warnings (1.08 sec) Records: 101535 Deleted: 0 Skipped: 0 Warnings: 69457
5.參考資料
- load data infile語法詳解
- load data infile參數詳解
- windows下MySQL8中LOAD DATA INFILE出現The used command is not allowed with this MySQL version問題
