《MYSQL教程mysql 的load data infile》要點(diǎn):
本文介紹了MYSQL教程mysql 的load data infile,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
LOAD DATA INFILE語(yǔ)句從一個(gè)文本文件中以很高的速度讀入一個(gè)表中.如果指定LOCAL關(guān)鍵詞,從客戶主機(jī)讀文件.如果LOCAL沒指定,文件必須位于服務(wù)器上.(LOCAL在MySQL3.22.6或以后版本中可用.)
為了安全原因,當(dāng)讀取位于服務(wù)器上的文本文件時(shí),文件必須處于數(shù)據(jù)庫(kù)目錄或可被所有人讀取.另外,為了對(duì)服務(wù)器上文件使用LOAD DATA INFILE,在服務(wù)器主機(jī)上你必須有file的權(quán)限.
頭一回用load data infile,以為只是把插入語(yǔ)句寫到一個(gè)文件里,然后用load data infile把文件傳入數(shù)據(jù)庫(kù)就OK了,于是生成了一個(gè)內(nèi)容類似同n句 insert into table_name (`id`,`name`,`content`) values (1,"a","abc"),(2,"b","abc"),(3,"c","abc");組成的.sql文件.然后在
PHP中執(zhí)行 LOAD DATA INFILE 'file_name.sql' INTO TABLE table_name;發(fā)現(xiàn)總是執(zhí)行出錯(cuò),真暈,不知道怎么回事,只好去再詳細(xì)地讀一下mysql的應(yīng)用手冊(cè):
如果你指定一個(gè)FIELDS子句,它的每一個(gè)子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可選的,除了你必須至少指定他們之一.
如果你不指定一個(gè)FIELDS子句,缺省值與如果你這樣寫的相同:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
如果你不指定一個(gè)LINES子句,缺省值與如果你這樣寫的相同:
LINES TERMINATED BY '\n'
換句話說(shuō),缺省值導(dǎo)致讀取輸入時(shí),LOAD DATA INFILE表現(xiàn)如下:
在換行符處尋找行邊界
在定位符處將行分進(jìn)字段
不要期望字段由任何引號(hào)字符封裝
將由“\”開頭的定位符、換行符或“\”解釋是字段值的部分字面字符
才知道原來(lái)我的sql里的內(nèi)容并不是按照 load data infile的缺省設(shè)置來(lái)寫的, 例如缺省設(shè)置下,每一句插入語(yǔ)句里的字段是由制表符隔開且內(nèi)容不以任何引號(hào)封裝(也就是括起來(lái))的,但我的是由逗號(hào)隔開且有雙引號(hào)括起來(lái)的,難怪會(huì)執(zhí)行出錯(cuò).
于是,將sql執(zhí)行語(yǔ)句寫成mysql_query('load data local infile "file_name.sql" into table `table_name` FIELDS TERMINATED BY "," ENCLOSED BY \'"\' ESCAPED BY "\\\" LINES TERMINATED BY "\n" STARTING BY ""');
這會(huì)算是執(zhí)行成功了,成功地往指定的數(shù)據(jù)表里插入了很多條記錄,可是又發(fā)現(xiàn)了一個(gè)問(wèn)題,插入的數(shù)據(jù)亂七八糟的,字段與要插入的內(nèi)容不符合我的要求,而且有好多是把字段名給插入到字段里面去了,唉,只好再回頭去又讀了一遍mysql中的load data infile用法,終于搞明白了,原來(lái)file_name.sql里面只需要按一定格式把內(nèi)容寫進(jìn)去就行了,不是把整個(gè)sql執(zhí)行語(yǔ)句都寫進(jìn)去的,真笨!^_^
于是,把內(nèi)容換成了
1,"a","abc"
2,"b","abc"
3,"c","abc"
而且內(nèi)容要與數(shù)據(jù)表里的字段從數(shù)量上和順序上都要嚴(yán)格對(duì)應(yīng)
在本地服務(wù)器(我用的是WINDOW主機(jī))上測(cè)試了一下,OK,操作成功!
然后把程序傳到網(wǎng)絡(luò)服務(wù)器上(LINUX主機(jī)),一執(zhí)行,提示:
Can't get stat of ……'' (Errcode: 13)
開始還以為是sql文件權(quán)限或者是mysql的root用戶權(quán)限的問(wèn)題,后來(lái)想不對(duì)呀,mysql的root用戶是超級(jí)用戶,肯定有權(quán)限的,那問(wèn)題就出在sql文件的權(quán)限上,后來(lái)把sql的權(quán)限改成777,執(zhí)行操作后還是不行.
網(wǎng)上搜索了一下,有說(shuō)把文件放在/var/lib/mysql里就行了,一試,果真可以,可是我又不可能在PHP網(wǎng)頁(yè)中把sql文件生成放到/var/lib/mysql下,費(fèi)盡了心思,最后終于在網(wǎng)上搜索到一個(gè)解決辦法:
使用LOCAL將比讓服務(wù)器直接存取文件慢些,因?yàn)槲募膬?nèi)容必須從客戶主機(jī)傳送到服務(wù)器主機(jī).在另一方面,你不需要file權(quán)限裝載本地文件.
你也可以使用mysqlimport實(shí)用程序裝載數(shù)據(jù)文件;它由發(fā)送一個(gè)LOAD DATA INFILE命令到服務(wù)器來(lái)運(yùn)作. --local選項(xiàng)使得mysqlimport從客戶主機(jī)上讀取數(shù)據(jù).如果客戶和服務(wù)器支持壓縮協(xié)議,你能指定--compress在較慢的網(wǎng)絡(luò)上獲得更好的性能.
其實(shí)辦法簡(jiǎn)單得很,那就是把load data infile寫成load data local infile 就OK啦.
以下是內(nèi)容補(bǔ)充: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 語(yǔ)句以很高的速度從一個(gè)文本文件中讀取行到一個(gè)表中.文件名必須是一個(gè)文字字符串.
關(guān)于INSERT 與LOAD DATA INFILE 的效率和提高LOAD DATA INFILE 速度的更多信息,參考管理員手冊(cè)中的加速INSERT 語(yǔ)句 .
系統(tǒng)變量character_set_database 所指出的字符集被用來(lái)解釋文件中的信息.SET NAMES 和設(shè)置character_set_client 不會(huì)影響輸入的解釋.
用戶也可以使用import 實(shí)用程序裝載數(shù)據(jù)文件;它通過(guò)發(fā)送一個(gè)LOAD DATA INFILE 命令到服務(wù)器來(lái)實(shí)現(xiàn).--local 選項(xiàng)使得import 從客戶端主機(jī)讀取數(shù)據(jù)文件.如果客戶端與服務(wù)器支持壓縮協(xié)議,用戶可以指定--compress 選項(xiàng),以在較慢的網(wǎng)絡(luò)中獲得更好的性能.參考管理員手冊(cè)中的import ― 數(shù)據(jù)導(dǎo)入程序 .
如果用戶指定關(guān)鍵詞LOW_PRIORITY,LOAD DATA 語(yǔ)句的執(zhí)行將會(huì)被延遲,直到?jīng)]有其它的客戶端正在讀取表.
如果一個(gè)GSSYS 表滿足同時(shí)插入的條件(即該表在中間有空閑塊),并且您對(duì)這個(gè)GSSYS 表指定了CONCURRENT,則當(dāng)LOAD DATA 正在執(zhí)行時(shí),其它線程會(huì)從表中重新獲取數(shù)據(jù).即使沒有其它線程在同時(shí)使用本表格,使用本選項(xiàng)也會(huì)略微影響LOAD DATA 的性能.
如果指定了LOCAL 關(guān)鍵字,它將對(duì)連接的客戶端做出解釋:
? 如果指定了LOCAL,客戶端主機(jī)上的客戶端組件讀取文件并發(fā)送到服務(wù)器.可以給出文件的完整路徑以確定其精確位置.如果給出的是相對(duì)路徑,則文件名是相對(duì)于客戶端組件啟動(dòng)時(shí)所在的目錄.
? 如果沒有指定LOCAL,文件是位于服務(wù)器的主機(jī)上,并且直接被服務(wù)器讀取.
當(dāng)從服務(wù)器主機(jī)定位文件時(shí),服務(wù)器使用下列規(guī)則:
? 如果給定完整的路徑,服務(wù)器使用該路徑名.
? 如果給定一個(gè)或多個(gè)前置構(gòu)件的相對(duì)路徑,服務(wù)器以相對(duì)服務(wù)器的數(shù)據(jù)目錄搜索文件.
? 如果給定沒有前置構(gòu)件的文件名,服務(wù)器從當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)目錄搜尋文件.
注意:
這些規(guī)則意味著,一個(gè)以'/gsfile.txt' 給出的文件是從服務(wù)器的數(shù)據(jù)目錄中讀取的,然而,以`gsfile.txt' 給出的一個(gè)文件是從當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)目錄下讀取的.舉例來(lái)說(shuō),下面的LOAD DATA 語(yǔ)句從db1 數(shù)據(jù)庫(kù)目錄下讀取文件'data.txt',因?yàn)閐b1 是當(dāng)前數(shù)據(jù)庫(kù),即使語(yǔ)句明確把文件載入到db2數(shù)據(jù)庫(kù)中的表里,也會(huì)從db1 目錄中讀取:
sqlcli> USE db1;
sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE db2.gs_table;
注意:
指定Windows 路徑名時(shí),使用的是斜線而不是反斜線.如果要用反斜線,必須雙寫.
出于安全的原因,當(dāng)讀取位于服務(wù)器上的文本文件時(shí),文件必須位于數(shù)據(jù)庫(kù)目錄下或者可以被所有用戶讀取.也就是說(shuō),當(dāng)對(duì)服務(wù)器上的文件執(zhí)行LOAD DATA INFILE 時(shí),用戶必須獲得FILE 權(quán)限.
參考管理員手冊(cè)中的GBase 提供的權(quán)限 .
與服務(wù)器直接訪問(wèn)文件相比,使用LOCAL 速度稍微慢些,這是因?yàn)槲募膬?nèi)容必須通過(guò)客戶端到服務(wù)器的連接傳送.另一方面,對(duì)于本地文件,不需要獲得FILE 權(quán)限.
只有服務(wù)器和客戶端都允許時(shí),LOCAL 才可以工作.例如,如果kernel 啟動(dòng)時(shí),--local-infile=0,則LOCAL 不能工作.參考管理員手冊(cè)中的LOAD DATA LOCAL 的安全問(wèn)題 .
REPLACE 和IGNORE 關(guān)鍵字處理那些與已存在的主鍵值重復(fù)的輸入記錄.
如果指定了REPLACE,輸入行將會(huì)代替已存在的行(也就是說(shuō),主索引值相同的行將作為存在的行).參考REPLACE 語(yǔ)法 .
如果指定了IGNORE,與已存在行主鍵值重復(fù)的輸入行將被跳過(guò).如果不指定二者中的任一個(gè),則操作行為將依賴是否指定了LOCAL 關(guān)鍵字.沒有指定LOCAL,則如果發(fā)現(xiàn)有重復(fù)的鍵值,將產(chǎn)生一個(gè)錯(cuò)誤,并忽略文本文件的其余部分.如果指定了LOCAL,則缺省的操作行為將與指定了IGNORE 的相同;這是因?yàn)?在操作過(guò)程中,服務(wù)器沒有辦法終止文件的傳送.
如果希望裝載操作中忽略外鍵約束,可以在執(zhí)行LOAD DATA 之前執(zhí)行SET FOREIGN_KEY_CHECKS=0 語(yǔ)句.
如果用戶在一個(gè)空的GsSYS 表上使用LOAD DATA INFILE,所有非唯一索引會(huì)以分批方式被創(chuàng)建(就像REPAIR).當(dāng)有許多索引時(shí),這通常可以使LOAD DATA INFILE 更快一些.正常情況下非常快,但也有極端的情況,用戶可以通過(guò)在裝載文件之前使用ALTER TABLE .. DISABLE KEYS 關(guān)閉它們和在裝載文件之后使用ALTER TABLE .. ENABLE KEYS 重建索引,從而加速索引創(chuàng)建.參考管理員手冊(cè)中的加速INSERT 語(yǔ)句 .
LOAD DATA INFILE 是SELECT ... INTO OUTFILE 的反操作.參考SELECT 語(yǔ)法 . 使用SELECT ... INTO OUTFILE 將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫(kù)寫到一個(gè)文件中.使用LOAD DATA INFILE 讀取文件到數(shù)據(jù)庫(kù)中.兩個(gè)命令的FIELDS 和LINES 子句的語(yǔ)法是一樣的.兩個(gè)子句都是可選的,但是如果兩個(gè)同時(shí)被指定,FIELDS 子句必須出現(xiàn)在LINES 子句之前.
如果用戶指定一個(gè)FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和ESCAPED BY) 也是可選的,不過(guò),用戶必須至少指定它們中的一個(gè).
如果用戶沒有指定一個(gè)FIELDS 子句,缺省時(shí)如同使用下列語(yǔ)句:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
如果用戶沒有指定一個(gè)LINES 子句,缺省時(shí)如同使用下列語(yǔ)句:
LINES TERMINATED BY '\n' STARTING BY ''
換句話說(shuō),當(dāng)讀取輸入時(shí),缺省的LOAD DATA INFILE 表現(xiàn)如下:
? 在換行符處尋找行的邊界.
? 不遺漏任何行前綴.
? 在制表符處將行分離成字段.
? 不認(rèn)為字段由任何引號(hào)字符封裝.
? 將有 “\” 開頭的定位符、換行符或`\' 解釋為字段值的一個(gè)文字字符.
相反的,當(dāng)寫入輸出時(shí),缺省值導(dǎo)致SELECT ... INTO OUTFILE 表現(xiàn)如下:
? 在字段值間加上制表符.
? 不用任何引號(hào)字符封裝字段.
? 使用 “\” 轉(zhuǎn)義出現(xiàn)在字段值中的定位符、換行符或`\' 字符實(shí)例.
? 在行的結(jié)尾處加上換行符.
注意:
為了寫FIELDS ESCAPED BY '\\',用戶必須指定兩個(gè)反斜線,該值會(huì)作為一個(gè)反斜線被讀入.
注意:
如果是Windows 系統(tǒng)的文本文件,可能必須使用LINES TERMINATED BY '\r\n' 來(lái)讀取文件,這是因?yàn)閃indows 系統(tǒng)的特點(diǎn)是使用兩個(gè)字符作為行終止符.在某些程序中,在書寫文件時(shí),可能使用\r 作為行終止符,如寫字板.讀取這類文件時(shí),需要用LINES TERMINATED BY '\r'.
如果所有的將要讀取的行都有用戶希望忽略的前綴,可以使用LINES STARTING BY 'prefix_string' 來(lái)跳過(guò)此前綴(和在它前面的任何內(nèi)容).如果一個(gè)行沒有此前綴,則整個(gè)行都被跳過(guò).注意,prefix_string 可能在行的中間!
例如:
sqlcli> LOAD DATA INFILE '/tmp/test.txt'
-> INTO TABLE test LINES STARTING BY "xxx";
用它讀取包含有下面內(nèi)容的文件:
xxx"Row",1
something xxx"Row",2
則可以得到數(shù)據(jù)(“row”,1)和(“row”,2).
IGNORE number LINES 這個(gè)選項(xiàng)可以用來(lái)忽略文件開頭部分的行.例如,可以用IGNORE 1 LINES 來(lái)跳過(guò)含有列名的的頭一行:
sqlcli> LOAD DATA INFILE '/tmp/test.txt'
-> INTO TABLE test IGNORE 1 LINES;
當(dāng)用戶一前一后地使用SELECT ... INTO OUTFILE 和LOAD DATA INFILE 將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫(kù)寫到一個(gè)文件中,然后再?gòu)奈募袑⑺x入數(shù)據(jù)庫(kù)中時(shí),兩個(gè)命令的字段和行處理選項(xiàng)必須匹配.否則,LOAD DATA INFILE 將不能正確地解釋文件內(nèi)容.假設(shè)用戶使用SELECT ... INTO OUTFILE 以逗號(hào)分隔字段的方式將數(shù)據(jù)寫入到一個(gè)文件中:
sqlcli> SELECT * INTO OUTFILE 'data.txt'
-> FIELDS TERMINATED BY ','
-> FROM table2;
為了將由逗號(hào)分隔的文件讀回時(shí),正確的語(yǔ)句應(yīng)該是:
sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE table2
-> FIELDS TERMINATED BY ',';
如果用戶試圖用下面所示的語(yǔ)句讀取文件,它將不會(huì)工作,因?yàn)槊頛OAD DATA INFILE 以定位符區(qū)分字段值:
sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE table2
-> FIELDS TERMINATED BY '\t';
可能的結(jié)果是每個(gè)輸入行將被解釋為一個(gè)單獨(dú)的字段.
LOAD DATA INFILE 也可以被用來(lái)讀取外部源獲得的文件.例如,dBASE 格式的文件,字段以逗號(hào)分隔并以雙引號(hào)包圍著.如果文件中的行以一個(gè)換行符終止,那么下面所示的可以說(shuō)明用戶將用來(lái)裝載文件的字段和行處理選項(xiàng):
sqlcli> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY '\n';
任何字段和行處理選項(xiàng)都可以指定一個(gè)空字符串('').如果不是空的,FIELDS [OPTIONALLY] ENCLOSED BY 和FIELDS ESCAPED BY 值必須是一個(gè)單個(gè)字符.FIELDS TERMINATED BY 和LINES TERMINATED BY 值可以超過(guò)一個(gè)字符.例如,為了寫入由回車換行符終止的行,或讀取包含這樣的行的文件,應(yīng)該指定一個(gè)LINES TERMINATED BY '\r\n' 子句.
FIELDS [OPTIONALLY] ENCLOSED BY 控制字段的引用.對(duì)于輸出(SELECT ... INTO OUTFILE),如果用戶省略單詞OPTIONALLY,所有的字段被ENCLOSED BY 字符包圍.這樣的一個(gè)輸出文件(以一個(gè)逗號(hào)作為字段分界符)示例如下:
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
如果用戶指定OPTIONALLY,ENCLOSED BY 字符僅被用于包裝諸如含有字符串類型的字段(諸如CHAR,BINARY,TEXT 或ENUM):
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
注意:
在一個(gè)字段值中出現(xiàn)的ENCLOSED BY 字符,通過(guò)用ESCAPED BY 字符作為其前綴對(duì)其轉(zhuǎn)義.同時(shí)也要注意,如果用戶指定一個(gè)空的ESCAPED BY 值,可能會(huì)產(chǎn)生不能被LOAD DATA INFILE 正確讀出的輸出文件.例如,如果轉(zhuǎn)義字符為空,上面顯示的輸出將變成如下顯示的輸出.請(qǐng)注意第四行的第二個(gè)字段,它包含一個(gè)跟在一個(gè)引號(hào)后的逗號(hào),看起來(lái) 像是一個(gè)字段的終止:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
對(duì)于輸入,ENCLOSED BY 字符如果存在,它將從字段值的尾部被剝離.(不管OPTIONALLY 是否被指定,都是這樣;對(duì)于輸入解釋,OPTIONALLY 不會(huì)影響它.)如果在ENCLOSED BY 字符前存在ESCAPED BY 字符,那么它將被解釋為當(dāng)前字段值的一部分.
如果字段以ENCLOSED 字符開始,只要后面緊跟著字段或行TERMINATED BY 序列 ,這個(gè)字符實(shí)例就被認(rèn)為用來(lái)終止一個(gè)字段值.為了明確,如果在字段中要使用ENCLOSED BY 字符,可以重復(fù)寫兩遍該字符,那么它們會(huì)被解釋成單個(gè)ENCLOSED BY字符處理.例如,如果指定ENCLOSED BY '"',引號(hào)將做如下處理:
"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss -> The "BIG" boss
The ""BIG"" boss -> The ""BIG"" boss
FIELDS ESCAPED BY 控制如何寫入或讀出特殊字符.如果FIELDS ESCAPED BY 字符不是空的,它將被用于做為下列輸出字符的前綴:
? FIELDS ESCAPED BY 字符
? FIELDS [OPTIONALLY] ENCLOSED BY 字符 .
? FIELDS TERMINATED BY 和LINES TERMINATED BY 值的第一個(gè)字符.
? ASCII 0 (實(shí)際上在轉(zhuǎn)義字符后寫上ASCII '0',而不是一個(gè)零值字節(jié)).
如果FIELDS ESCAPED BY 字符為空,那么將沒有字符被轉(zhuǎn)義并且NULL 值仍輸出為NULL,而不是\N.指定一個(gè)空的轉(zhuǎn)義字符可能不是一個(gè)好的方法,特別是用戶的數(shù)據(jù)字段值中包含剛才列表中的任何字符時(shí).
對(duì)于輸入值,如果FIELDS ESCAPED BY 字符不是空字符,則出現(xiàn)這種字符時(shí)會(huì)被剝離,然后以下字符被作為字段值的一部分.例外情況是,被轉(zhuǎn)義的‘0'或‘N'(例如,\0 或\N,此時(shí)轉(zhuǎn)義符為‘\').這些序列被理解為ASCII NUL(一個(gè)零值字節(jié))和NULL.用于NULL 處理的規(guī)則在本節(jié)的后部進(jìn)行說(shuō)明.
關(guān)于更多的 “\” 轉(zhuǎn)義語(yǔ)法信息,查看文字值 .
在某些情況下,字段與行處理相互作用:
? 如果LINES TERMINATED BY 是一個(gè)空字符串,FIELDS TERMINATED BY 是非空的,則各行以FIELDS TERMINATED BY作為結(jié)尾.
? 如果FIELDS TERMINATED BY 和FIELDS ENCLOSED BY 值都是空的(''),那么一個(gè)固定行(無(wú)定界符) 格式將被使用.用固定行格式時(shí),在字段之間不使用分隔符(但是用戶仍然有一個(gè)行終結(jié)符).列值的寫入和讀取使用列的“顯示”寬度.例如,如果一個(gè)列被定義 為INT(7),列的值將使用7 個(gè)字符的字段被寫入.對(duì)于輸入,列值通過(guò)讀取7 個(gè)字符來(lái)獲得.
LINES TERMINATED BY 仍然用于分離行.如果一行沒有包含所有的字段,那么列的剩余部分被設(shè)置為它們的默認(rèn)值.如果用戶沒有一個(gè)行終結(jié)符,用戶應(yīng)該設(shè)置它為''.在這種情況下,文本文件必須包含每行的所有的字段.
固定行格式也影響對(duì)NULL 值的處理;見下面.注意,如果用戶正在使用一個(gè)多字節(jié)的字符集,固定長(zhǎng)度格式將不能工作.
NULL 值的處理有很多,取決于用戶所使用的FIELDS 和LINES 選項(xiàng):
? 對(duì)于缺省的FIELDS 和LINES 值,輸出時(shí),NULL 被寫成\N,當(dāng)讀入時(shí),\N 被作為NULL 讀入(假設(shè)ESCAPED BY 字符為 “\”).
? 如果FIELDS ENCLOSED BY 不是空值,則包含以文字詞語(yǔ)NULL 為值的字段被作為NULL 值讀取.這與被FIELDS ENCLOSED BY 字符包圍的詞語(yǔ)NULL不同.該詞語(yǔ)被作為字符串'NULL'讀取.
? 如果FIELDS ESCAPED BY 是空的,NULL 值被寫為詞NULL.
? 采用固定行格式時(shí)(當(dāng)FIELDS TERMINATED BY 和FIELDS ENCLOSED BY 均為空值時(shí)采用),NULL 被作為一個(gè)空字符串寫入.注意,這會(huì)導(dǎo)致在被寫入文件時(shí),表中的NULL 值和空字符串均無(wú)法辨別,這是因?yàn)閮烧叨急蛔鳛榭兆址畬懭?如果用戶需要在讀取文件并返回時(shí)能夠分辨兩者,則用戶不應(yīng)使用固定行格式.
一些不能被LOAD DATA INFILE 支持的情況:
? 固定尺寸的記錄行(FIELDS TERMINATED BY 和FIELDS ENCLOSED BY 均為空)和BLOB 或TEXT 列.
? 如果用戶指定一個(gè)分隔符與另一個(gè)相同,或是另一個(gè)的前綴,LOAD DATA INFILE 可能會(huì)不能正確地解釋輸入.例如,下列的FIELDS 子句將會(huì)產(chǎn)生問(wèn)題:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
?
? 如果FIELDS ESCAPED BY 為空,一個(gè)字段值中包含有FIELDS ENCLOSED BY 或LINES TERMINATED BY 后面緊跟著FIELDS TERMINATED BY 的值時(shí),將會(huì)引起LOAD DATA INFILE 過(guò)早地停止讀取一個(gè)字段或一行.這是因?yàn)長(zhǎng)OAD DATA INFILE 不知道字段或行值在哪里結(jié)束.
下面的例子將裝載persondata 表的所有列:
sqlcli> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
默認(rèn)情況下,當(dāng)LOAD DATA INFILE 語(yǔ)句后沒有提供字段列時(shí),那么LOAD DATA INFILE 認(rèn)為輸入行包含表列中所有的字段.如果用戶希望裝載表中的某些列,那指定一個(gè)字段列表:
sqlcli> LOAD DATA INFILE 'persondata.txt'
-> INTO TABLE persondata (col1,col2,...);
如果輸入文件的字段順序不同于表中列的順序,用戶也必須指定一個(gè)字段列表.否則GBase 不知道如何將輸入字段與表中的列匹配.
Column 列表可以包含列名或者用戶變量,并且支持SET 子句.這使得能用輸入值給用戶變量賦值, 并在賦予列的結(jié)果之前對(duì)這些值進(jìn)行變換.
SET 子句中的用戶變量有多種用途.下面的例子將數(shù)據(jù)文件的第一列直接作為t1.column1 的值,并將第二列賦予一個(gè)用戶變量,此變量在作為t2.column2 的值之前進(jìn)行一個(gè)除法操作
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @var1)
SET column2 = @var1/100;
SET 子句可以提供不是來(lái)源于輸入文件的值.下面的語(yǔ)句將column3 設(shè)置為當(dāng)前的日期和時(shí)間:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, column2)
SET column3 = CURRENT_TIMESTAMP;
通過(guò)將一個(gè)輸入值賦予一個(gè)用戶變量,可以將此輸入值丟棄,并且不將此值賦予表的一個(gè)列:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3);
使用列/變量列表和SET子句要受到一下限制:
? SET 子句中的賦值列名應(yīng)當(dāng)只能在賦值操作符的左邊.
? 在SET 賦值語(yǔ)句中,可以使用子查詢.此查詢返回一個(gè)將被賦予列的值,它可能僅僅是一個(gè)標(biāo)量查詢.不能用子查詢?nèi)ゲ樵儗⒈粚?dǎo)入的表.
? 對(duì)于列/變量列表或SET 子句,由于使用IGNORE 子句而被忽略的行就不會(huì)被處理.
? 由于用戶變量沒有顯示寬度,當(dāng)導(dǎo)入的數(shù)據(jù)是行固定格式時(shí),將不能使用用戶變量.
當(dāng)處理輸入行時(shí),LOAD DATA 將行分為域,如果提供了列/變量列表和SET 子句,將按照它去使用這些值.然后得到的行就插入到表中.如果此表有BEFORE INSERT 或AFTER INSERT 觸發(fā)器,則插入行前后將分別激活它們.
如果輸入的記錄行有太多的字段,多余的字段將被忽略,并增加警告的數(shù)目.
如果一個(gè)輸入行的字段較少,沒有輸入字段的列將被設(shè)置為缺省值.缺省值賦值在CREATE TABLE 語(yǔ)法 中被描述.
一個(gè)空的字段值不同于字段值丟失的解釋:
? 對(duì)于字符串類型,列被設(shè)置為空字符串.
? 對(duì)于數(shù)字類型,列被設(shè)置為0.
? 對(duì)于日期和時(shí)間類型,列被設(shè)置為適合列類型的“零”值.參考日期和時(shí)間類型 .
如果在一個(gè)INSERT 或UPDATE 語(yǔ)句中明確地將一個(gè)空字符串賦給一個(gè)字符串、數(shù)字或日期或時(shí)間類型,用戶會(huì)得到與上面相同的結(jié)果.
只有在兩種情況下TIMESTAMP 列被設(shè)置為當(dāng)前日期和時(shí)間.一種情況時(shí)當(dāng)列有一個(gè)NULL 值(也就是\N)時(shí);另一種情況是(僅對(duì)于第一個(gè)TIMESTAMP 列),當(dāng)一個(gè)字段清單被指定時(shí),TIMESTAMP 列會(huì)從字段清單中被略去.
LOAD DATA INFILE 認(rèn)為所有的輸入均是字符串,因而,對(duì)于ENUM 或SET 列,用戶不能以INSERT 語(yǔ)句的形式為其設(shè)置數(shù)字值.所有的ENUM 和SET 必須以字符串指定!
當(dāng)LOAD DATA INFILE 查詢結(jié)束時(shí),它返回信息字符串,格式如下:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
《MYSQL教程mysql 的load data infile》是否對(duì)您有啟發(fā),歡迎查看更多與《MYSQL教程mysql 的load data infile》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/11274.html