LOAD DATA INFILE語句從一個(gè)文本文件中以很高的速度讀入一個(gè)表中。如果指定LOCAL關(guān)鍵詞,從客戶主機(jī)讀文件。如果LOCAL沒指定,文件必須位于服務(wù)器上。(LOCAL在MySQL3.22.6或以后版本中可用。)
為了安全原因,當(dāng)讀取位于服務(wù)器上的文本文件時(shí),文件必須處于數(shù)據(jù)庫目錄或可被所有人讀取。另外,為了對服務(wù)器上文件使用LOAD DATA INFILE,在服務(wù)器主機(jī)上你必須有file的權(quán)限。
頭一回用load data infile,以為只是把插入語句寫到一個(gè)文件里,然后用load data infile把文件傳入數(shù)據(jù)庫就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)用手冊:
如果你指定一個(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'
換句話說,缺省值導(dǎo)致讀取輸入時(shí),LOAD DATA INFILE表現(xiàn)如下:
在換行符處尋找行邊界
在定位符處將行分進(jìn)字段
不要期望字段由任何引號字符封裝
將由“/”開頭的定位符、換行符或“/”解釋是字段值的部分字面字符
才知道原來我的sql里的內(nèi)容并不是按照 load data infile的缺省設(shè)置來寫的, 例如缺省設(shè)置下,每一句插入語句里的字段是由制表符隔開且內(nèi)容不以任何引號封裝(也就是括起來)的,但我的是由逗號隔開且有雙引號括起來的,難怪會(huì)執(zhí)行出錯(cuò)。
于是,將sql執(zhí)行語句寫成mysql_query('load data local infile "file_name.sql" into table `table_name` FIELDS TERMINATED BY "," ENCLOSED BY /'"/' ESCAPED BY "http:///" LINES TERMINATED BY "/n" STARTING BY ""');
這會(huì)算是執(zhí)行成功了,成功地往指定的數(shù)據(jù)表里插入了很多條記錄,可是又發(fā)現(xiàn)了一個(gè)問題,插入的數(shù)據(jù)亂七八糟的,字段與要插入的內(nèi)容不符合我的要求,而且有好多是把字段名給插入到字段里面去了,唉,只好再回頭去又讀了一遍mysql中的load data infile用法,終于搞明白了,原來file_name.sql里面只需要按一定格式把內(nèi)容寫進(jìn)去就行了,不是把整個(gè)sql執(zhí)行語句都寫進(jìn)去的,真笨!^_^
于是,把內(nèi)容換成了
1,"a","abc"
2,"b","abc"
3,"c","abc"
而且內(nèi)容要與數(shù)據(jù)表里的字段從數(shù)量上和順序上都要嚴(yán)格對應(yīng)
在本地服務(wù)器(我用的是WINDOW主機(jī))上測試了一下,OK,操作成功!
然后把程序傳到網(wǎng)絡(luò)服務(wù)器上(LINUX主機(jī)),一執(zhí)行,提示: