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語句用於高速地從一個文本文件中讀取行,並裝入一個表中。文件名稱必須爲一個文字字符串。mysql
由character_set_database系統變量指示的字符集被用於解釋文件中的信息。SET NAMES和character_set_client的設置不會影響對輸入的解釋。sql
典型的示例shell
LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE tbl_name FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
若是您只想載入一個表的部分列,則應指定一個列清單:數據庫
LOAD DATA LOCAL INFILE 'persondata.txt' INTO TABLE persondata (col1,col2);
若是指定了LOCAL,則被認爲與鏈接的客戶端有關:bash
當在服務器主機上爲文件定位時,服務器使用如下規則:服務器
注意,這些規則意味着名爲./myfile.txt的文件會從服務器數據目錄中被讀取,而名爲myfile.txt的一樣的文件會從默認數據庫的數據庫目錄中讀取。ui
從客戶端使用絕對路徑load數據spa
LOAD DATA LOCAL INFILE '/import/data.txt' INTO TABLE db2.my_table;
從服務器裏使用相對路徑load數據.net
下面的LOAD DATA語句會從db1數據庫目錄中讀取文件data.txt,由於db1是當前數據庫。即便語句明確把文件載入到db2數據庫中的表裏,也會從db1目錄中讀取。命令行
USE db1; LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
IGNORE number LINES選項能夠被用於在文件的開始處忽略行。
您可使用IGNORE 1 LINES來跳過一個包含列名稱的起始標題行:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
有些輸入記錄把原有的記錄複製到惟一關鍵字值上。REPLACE和IGNORE關鍵字用於控制這些輸入記錄的操做。
若是您指定了REPLACE,則輸入行會替換原有行(換句話說,與原有行同樣,對一個主索引或惟一索引具備相同值的行)。
若是您指定IGNORE,則把原有行復制到惟一關鍵字值的輸入行被跳過。
若是您這兩個選項都不指定,則運行狀況根據LOCAL關鍵詞是否被指定而定。不使用LOCAL時,當出現重複關鍵字值時,會發生錯誤,而且剩下的文本文件被忽略。使用LOCAL時,默認的運行狀況和IGNORE被指定時的狀況相同;這是由於在運行中間,服務器沒有辦法停止文件的傳輸。
若是您對一個空的MyISAM表使用LOAD DATA INFILE,則全部的非惟一索引會被建立在一個獨立批中(對於REPAIR TABLE)。當您有許多索引時,這一般會使LOAD DATA INFILE大大加快。一般,LOAD DATA INFILE的速度會很是快,可是在某些極端狀況下,您能夠在把文件載入到表中以前使用ALTER TABLE...DISABLE KEYS關閉LOAD DATA INFILE,或者在載入文件以後使用ALTER TABLE...ENABLE KEYS再次建立索引,使建立索引的速度更快。
若是您不指定FIELDS子句,則默認值爲假設您寫下以下語句時的值:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
若是您不指定LINES子句,則默認值爲假設您寫下以下語句時的值:
LINES TERMINATED BY '\n' STARTING BY ''
換句話說,當讀取輸入值時,默認值會使LOAD DATA INFILE按以下方式運行:
在新行處尋找行的邊界。
不會跳過任何行前綴。
在製表符處把行分解爲字段。
不但願字段被包含在任何引號字符之中。
出現製表符、新行、或在‘\’前有‘\’時,理解爲做爲字段值一部分的文字字符。
相反的,當編寫輸出值時,默認值會使SELECT...INTO OUTFILE按以下方式運行:
在字段之間寫入製表符。
不把字段包含在任何引號字符中。
當字段值中出現製表符、新行或‘\’時,使用‘\’進行轉義。
在行的末端寫入新行。
注意,要寫入FIELDS ESCAPED BY ‘\\’,您必須爲待讀取的值指定兩個反斜槓,做爲一個單反斜槓使用。
備註:若是您已經在Windows系統中生成了文本文件,您可能必須使用LINES TERMINATED BY ‘\r\n’來正確地讀取文件,由於Windows程序一般使用兩個字符做爲一個行終止符。部分程序,當編寫文件時,可能會使用\r做爲行終止符。要讀取這樣的文件,應使用LINES TERMINATED BY ‘\r’。
若是全部您但願讀入的行都含有一個您但願忽略的共用前綴,則您可使用'prefix_string'來跳過前綴(和前綴前的字符)。若是某行不包括前綴,則整個行被跳過。註釋:prefix_string會出如今一行的中間。
如下面的test.txt爲文件源
xxx"row",1 something xxx"row",2
使用如下sql導入數據
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test LINES STARTING BY "xxx";
最後並只獲得數據("row",1)和("row",2)。
若是jokes被由%%組成的行分隔,要讀取包含jokes的文件,您能夠這麼操做:
LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes FIELDS TERMINATED BY '' LINES TERMINATED BY '\n%%\n' (joke);
TERMINATED用於控制字段的分隔符,能夠爲多個字符。
ENCLOSED BY用於用於控制字段的引號,必須爲單一字符,若是您忽略了詞語OPTIONALLY,則全部的字段都被包含在ENCLOSED BY字符串中,若是您指定了OPTINALLY,則ENCLOSED BY字符只被用於包含具備字符串數據類型(好比CHAR, BINARY, TEXT或ENUM)的列中的值.
SELECT...INTO OUTFILE導出數據,ENCLOSED BY '"',忽略OPTIONALLY
"1","a string","100.20"
SELECT...INTO OUTFILE導出數據,ENCLOSED BY '"',指定OPTIONALLY
1,"a string",100.20
ESCAPED BY用於轉義,FIELDS ESCAPED BY值必須爲單一字符。
若是FIELDS ESCAPED BY字符爲空字符,則沒有字符被轉義,而且NULL被做爲NULL輸出,而不是\N。去指定一個空的轉義符不是一個好辦法,特別是若是數據的字段值包含任何剛給定的清單中的字符時,更不能這麼作。
若是在字段值內出現ENCLOSED BY字符,則經過使用ESCAPED BY字符做爲前綴,對ENCLOSED BY字符進行轉義。
一、 能夠用--local-infile=0選項啓動mysqld從服務器端禁用全部LOAD DATA LOCAL命令。
便是在/etc/my.cnf的[mysqld]下面添加local-infile=0選項。
二、 對於mysql命令行的客戶端,能夠通指定--local-infile[=1]選項啓用LOAD DATA LOCAL命令,
或經過--local-infile=0選項禁用。
相似地,對於mysqlimport,--local or -L選項啓用本地數據庫文件裝載。在任何狀況下,成功進行本地裝載須要服務器啓有相關選項。
當PHP設置權限後仍然不可以導入數據時:
因mysql 版本太低或者其餘緣由,mysql配置文件中設置了local_infile=1。經過查數據庫 show variables like 'local_inile';mysql語句設置權限:set global local_infile = 1; 都沒有效。
使用shell 操做mysql 導入
#!/bin/bash file=$1 table=$2 query="LOAD DATA LOCAL INFILE '$file' INTO TABLE $table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (uid,name,score,home,ctime);"
echo 'file:: '$file'<br>'
echo 'tbl:: '$table'<br>'
/usr/local/services/mysql/bin/mysql --local-infile -h127.0.0.1 -P3600 -uroot -p123456 -e "$query"