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進行數據庫、表的創建工作。

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沒指定,文件必須位於服務器上。
  • 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 操作過程中的問題

運行如下代碼:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM