Mysql加載本地CSV文件

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進行數據庫、表的建立工做。html

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的權限。mysql

  • 若是指定關鍵詞low_priority,那麼MySQL將會等到沒有其餘人讀這個表的時候,才把數據插入。可使用以下的命令: 
    load data  low_priority infile "/home/mark/data sql" into table Orders;
  • 若是指定local關鍵詞,則代表從客戶主機讀文件。若是local沒指定,文件必須位於服務器上。
  • replaceignore關鍵詞控制對現有的惟一鍵記錄的重複的處理。若是你指定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文件能夠忽略掉第一行標題

4.2 操做過程當中的問題

運行以下代碼:sql

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默認關閉,所以用的時候須要打開。windows

查看local_infile變量的狀態:安全

mysql> show global variables like 'local_infile'; +---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF    |
+---------------+-------+

 顯示爲關閉狀態,使用以下命令打開:服務器

mysql> set global local_infile = 'ON';

並再次查看:ui

mysql> show global variables like 'local_infile'; +---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+

而後再進行導入工做:this

mysql> LOAD DATA LOCAL INFILE 'D:/XXX.csv' INTO TABLE database.tablename FIELDS TERMINATED BY ',';

仍然報一樣的錯誤:spa

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.參考資料

相關文章
相關標籤/搜索