MYSQL 數據導入導出LOAD DATA AND OUTFILE


MYSQL LOAD DATA AND OUTFILE                2011-09-27 10:39:33

LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]

    INTO TABLE tbl_name     [FIELDS         [TERMINATED BY '\t']         [OPTIONALLY] ENCLOSED BY '']         [ESCAPED BY '\\' ]]     [LINES TERMINATED BY '\n']     [IGNORE number LINES]     [(col_name,...)]

LOAD DATA INFILE語句從一個文本文件中以很高的速度讀入一個表中。如果指定LOCAL關鍵詞,從客戶主機讀文件。如果LOCAL沒指定,文件必須位於服務器上。(LOCAL在MySQL3.22.6或以后版本中可用。)

為了安全原因,當讀取位於服務器上的文本文件時,文件必須處於數據庫目錄或可被所有人讀取。另外,為了對服務器上文件使用LOAD DATA INFILE,在服務器主機上你必須有file的權限。見6.5 由MySQL提供的權限。

如果你指定關鍵詞LOW_PRIORITY,LOAD DATA語句的執行被推遲到沒有其他客戶讀取表后。

使用LOCAL將比讓服務器直接存取文件慢些,因為文件的內容必須從客戶主機傳送到服務器主機。在另一方面,你不需要file權限裝載本地文件。

你也可以使用mysqlimport實用程序裝載數據文件;它由發送一個LOAD DATA INFILE命令到服務器來運作。 --local選項使得mysqlimport從客戶主機上讀取數據。如果客戶和服務器支持壓縮協議,你能指定--compress在較慢的網絡上獲得更好的性能。

當在服務器主機上尋找文件時,服務器使用下列規則:

如果給出一個絕對路徑名,服務器使用該路徑名。 如果給出一個有一個或多個前置部件的相對路徑名,服務器相對服務器的數據目錄搜索文件。 如果給出一個沒有前置部件的一個文件名,服務器在當前數據庫的數據庫目錄尋找文件。 注意這些規則意味着一個像“./myfile.txt”給出的文件是從服務器的數據目錄讀取,而作為“myfile.txt”給出的一個文件是從當前數據庫的數據庫目錄下讀取。也要注意,對於下列哪些語句,對db1文件從數據庫目錄讀取,而不是db2:

mysql> USE db1; mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;

REPLACE和IGNORE關鍵詞控制對現有的唯一鍵記錄的重復的處理。如果你指定REPLACE,新行將代替有相同的唯一鍵值的現有行。如果你 指定IGNORE,跳過有唯一鍵的現有行的重復行的輸入。如果你不指定任何一個選項,當找到重復鍵鍵時,出現一個錯誤,並且文本文件的余下部分被忽略時。

如果你使用LOCAL關鍵詞從一個本地文件裝載數據,服務器沒有辦法在操作的當中停止文件的傳輸,因此缺省的行為好像IGNORE被指定一樣。

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作, SELECT句法。為了將一個數據庫的數據寫入一個文件,使用SELECT ... INTO OUTFILE,為了將文件讀回數據庫,使用LOADDATAINFILE。兩個命令的FIELDS和LINES子句的語法是相同的。兩個子句是可選的,但是如果指定兩個,FIELDS必須在LINES之前。

如果你指定一個FIELDS子句,它的每一個子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可選的,除了你必須至少指定他們之一。

如果你不指定一個FIELDS子句,缺省值與如果你這樣寫的相同:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

如果你不指定一個LINES子句,缺省值與如果你這樣寫的相同:

LINES TERMINATED BY '\n' 換句話說,缺省值導致讀取輸入時,LOAD DATA INFILE表現如下:

在換行符處尋找行邊界 在定位符處將行分進字段 不要期望字段由任何引號字符封裝 將由“\”開頭的定位符、換行符或“\”解釋是字段值的部分字面字符 相反,缺省值導致在寫入輸出時,SELECT ... INTO OUTFILE表現如下:

在字段之間寫定位符 不用任何引號字符封裝字段 使用“\”轉義出現在字段中的定位符、換行符或“\”字符 在行尾處寫換行符 注意,為了寫入FIELDS ESCAPED BY '\\',對作為一條單個的反斜線被讀取的值,你必須指定2條反斜線值。

IGNORE number LINES選項可被用來忽略在文件開始的一個列名字的頭:

mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES;

當你與LOAD DATA INFILE一起使用SELECT ... INTOOUTFILE將一個數據庫的數據寫進一個文件並且隨后馬上將文件讀回數據庫時,兩個命令的字段和處理選項必須匹配,否則,LOAD DATAINFILE將不能正確解釋文件的內容。假定你使用SELECT ... INTO OUTFILE將由逗號分隔的字段寫入一個文件:

mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt'            FIELDS TERMINATED BY ','            FROM ...

為了將由逗號分隔的文件讀回來,正確的語句將是:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2            FIELDS TERMINATED BY ',';

相反,如果你試圖用下面顯示的語句讀取文件,它不會工作,因為它命令LOAD DATA INFILE在字段之間尋找定位符:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2            FIELDS TERMINATED BY '\t';

可能的結果是每個輸入行將被解釋為單個的字段。

LOAD DATA INFILE能被用來讀取從外部來源獲得的文件。例如,以dBASE格式的文件將有由逗號分隔並用雙引號包圍的字段。如果文件中的行由換行符終止,下面顯示的命令說明你將用來裝載文件的字段和行處理選項:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name            FIELDS TERMINATED BY ',' ENCLOSED BY '"'            LINES TERMINATED BY '\n';

任何字段或行處理選項可以指定一個空字符串('')。如果不是空,FIELDS [OPTIONALLY] ENCLOSEDBY和FIELDS  ESCAPED BY值必須是一個單個字符。FIELDS TERMINATED BY和LINES  TERMINATEDBY值可以是超過一個字符。例如,寫入由回車換行符對(CR+LF)終止的行,或讀取包含這樣行的一個文件,指定一個LINES  TERMINATEDBY '\r\n'子句。

FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包圍字符。對於輸出(SELECT ...  INTOOUTFILE),如果你省略OPTIONALLY,所有的字段由ENCLOSEDBY字符包圍。對於這樣的輸出的一個例子(使用一個逗號作為字 段分隔符)顯示在下面:

"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和VARCHAR字段:

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

注意,一個字段值中的ENCLOSED BY字符的出現通過用ESCAPEDBY字符作為其前綴來轉義。也要注意,如果你指定一個空ESCAPED BY值,可能產生不能被LOAD DATAINFILE正確讀出的輸出。例如,如果轉義字符為空,上面顯示的輸出顯示如下。注意到在第四行的第二個字段包含跟隨引號的一個逗號,它(錯誤地)好象要終止字段:

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

對於輸入,ENCLOSEDBY字符如果存在,它從字段值的尾部被剝去。(不管是否指定OPTIONALLY都是這樣;OPTIONALLY對於輸 入解釋不起作用)由ENCLOSED BY字符領先的ESCAPED  BY字符出現被解釋為當前字段值的一部分。另外,出現在字段中重復的ENCLOSEDBY被解釋為單個ENCLOSED  BY字符,如果字段本身以該字符開始。例如,如果ENCLOSED BY '"'被指定,引號如下處理:

"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值的第一個字符 ASCII 0(實際上將后續轉義字符寫成 ASCII'0',而不是一個零值字節) 如果FIELDS ESCAPED BY字符是空的,沒有字符被轉義。指定一個空轉義字符可能不是一個好主意,特別是如果在你數據中的字段值包含剛才給出的表中的任何字符。

對於輸入,如果FIELDS  ESCAPEDBY字符不是空的,該字符的出現被剝去並且后續字符在字面上作為字段值的一個部分。例外是一個轉義的“0”或“N”(即,\0或\N,如果 轉義字符是“\”)。這些序列被解釋為ASCII 0(一個零值字節)和NULL。見下面關於NULL處理的規則。

對於更多關於“\”- 轉義句法的信息,在某些情況下,字段和行處理選項相互作用:

如果LINES TERMINATED BY是一個空字符串並且FIELDS TERMINATED BY是非空的,行也用FIELDS TERMINATED BY終止。 如果FIELDS TERMINATED BY和FIELDS  ENCLOSEDBY值都是空的(''),一個固定行(非限定的)格式被使用。用固定行格式,在字段之間不使用分隔符。相反,列值只用列的“顯示”寬度被 寫入和讀出。例如,如果列被聲明為INT(7),列的值使用7個字符的字段被寫入。對於輸入,列值通過讀取7個字符獲得。固定行格式也影響NULL值的處 理;見下面。注意如果你正在使用一個多字節字符集,固定長度格式將不工作。 NULL值的處理有多種,取決於你使用的FIELDS和LINES選項:

對於缺省FIELDS和LINES值,對輸出,NULL被寫成\N,對輸入,\N被作為NULL讀入(假定ESCAPED BY字符是“\”)。 如果FIELDS ENCLOSED BY不是空的,包含以文字詞的NULL作為它的值的字段作為一個NULL值被讀入(這不同於包圍在FIELDS ENCLOSED BY字符中的字NULL,它作為字符串'NULL'讀入)。 如果FIELDS ESCAPED BY是空的,NULL作為字NULL被寫入。 用固定行格式(它發生在FIELDS TERMINATED BY和FIELDS  ENCLOSEDBY都是空的時候),NULL作為一個空字符串被寫入。注意,在寫入文件時,這導致NULL和空字符串在表中不能區分,因為他們都作為空 字符串被寫入。如果在讀回文件時需要能區分這兩者,你應該不使用固定行格式。 一些不被LOAD DATA INFILE支持的情況:

固定長度的行(FIELDS TERMINATED BY和FIELDS ENCLOSED BY都為空)和BLOB或TEXT列。 如果你指定一個分隔符與另一個相同,或是另一個的前綴,LOAD DATA INFILE不能正確地解釋輸入。例如,下列FIELDS子句將導致問題: FIELDS TERMINATED BY '"' ENCLOSED BY '"'

如果FIELDS ESCAPED BY是空的,一個包含跟隨FIELDS TERMINATED BY值之后的FIELDS ENCLOSEDBY或LINES TERMINATED BY的字段值將使得LOAD DATA INFILE過早地終止讀取一個字段或行。這是因為LOADDATA INFILE不能正確地決定字段或行值在哪兒結束。 下列例子裝載所有persondata表的行:

mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

沒有指定字段表,所以LOAD DATA INFILE期望輸入行對每個表列包含一個字段。使用缺省FIELDS和LINES值。

如果你希望僅僅裝載一張表的某些列,指定一個字段表:

mysql> LOAD DATA INFILE 'persondata.txt'            INTO TABLE persondata (col1,col2,...);

如果在輸入文件中的字段順序不同於表中列的順序,你也必須指定一個字段表。否則,MySQL不能知道如何匹配輸入字段和表中的列。

如果一個行有很少的字段,對於不存在輸入字段的列被設置為缺省值。

如果字段值缺省,空字段值有不同的解釋:

對於字符串類型,列被設置為空字符串。 對於數字類型,列被設置為0。 對於日期和時間類型,列被設置為該類型的適當“零”值。 如果列有一個NULL,或(只對第一個TIMESTAMP列)在指定一個字段表時,如果TIMESTAMP列從字段表省掉,TIMESTAMP列只被設置為當前的日期和時間。

如果輸入行有太多的字段,多余的字段被忽略並且警告數字加1。

LOAD DATA INFILE認為所有的輸入是字符串,因此你不能像你能用INSERT語句的ENUM或SET列的方式使用數字值。所有的ENUM和SET值必須作為字符串被指定!

如果你正在使用C API,當LOAD DATA INFILE查詢完成時,你可通過調用API函數mysql_info()得到有關查詢的信息。信息字符串的格式顯示在下面:

Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 當值通過INSERT語句插入時,在某些情況下出現警告,除了在輸入行中有太少或太多的字段時,LOAD DATA INFILE也產生警告。警告沒被存儲在任何地方;警告數字僅能用於表明一切是否順利。如果你得到警告並且想要確切知道你為什么得到他們,一個方法是使用SELECT ... INTO OUTFILE到另外一個文件並且把它與你的原版輸入文件比較。

 

使用mysqldump、into outfile和load data進行數據庫導入導出備份

(2012-02-12 14:35:18)

遇到了大批量導入導出數據的時候真的比較麻煩,動則幾G的數據,操作起來也是比較慢的,而且如果稍有不慎,還要重寫處理,最簡單的方法也是效率最低的方法就是使用PHP寫導入導出數據程序,用Shell來跑PHP,可是大家一直忽略了mysqldump 和mysql的into outfileload data ,如果這幾個命令使用靈活了,對於數據庫導入導出以及備份是很方便的。

使用mysqldump 和 source導入導出備份數據

如果要導出整個數據庫或者某一個數據庫的一個表,並且保持數據庫中表的名字不變,再次導入到另外一個數據庫的時候,可以使用mysqldump和source的方法。mysqldump的具體使用參數可以使用mysqldump --help 來查看,這里我簡單說下我常用的幾種參數。

1、mysqldump導出整個表的數據,包括建表信息,這也是最基礎的用法

mysqldump -uusername -ppassword databasename tablename > /home/db/db_bak2012

其中-u -p 和mysql的參數是一樣的,分別代表了用戶名和密碼,后面跟着是數據庫名和表明,>之后的是要導出的路徑。

上面的導出數據要導入數據庫的時候可以進入mysql,然后使用下面的命令來實現

source /home/db/db_bak2012

PS:這種方法是導出整個表數據,並且帶着建表信息,假如導入的數據庫有同名的表,會被替換

2、使用mysqldump導出固定條件的數據庫 mysqldump 有一個參數where可以設置導出固定條件的數據庫,where有個簡寫就是w,前者使用方法是–where后者是-w 例如,我要導出名字為data0數據庫table0中status為1的記錄,可以使用下面的命令

mysqldump -uusername -ppassword data0 table0 -wstatus=1 > /home/db/db_bak2012

3、前兩種方法導出的數據都有建表數據,如果導出的數據只是追加,那么使用mysqldump的兩個參數–no-create-info和–no-create-db,也就是下面的例子:

mysqldump -uusername -ppassword databasename tablename --no-create-db --no-create-info > /home/db/db_bak2012

使用into outfile 和 load data infile導入導出備份數據

如果要導出一個表中的部分字段或者部分符合條件的記錄,需要用到了mysql的into outfileload data infile 。 例如下面的mysql命令是把select的mytable表中的數據導出到/home/db_bak2012文件。

select * from mytable where status!=0 and name!='' into outfile '/home/db_bak2012' fields terminated by '|' enclosed by '"' lines terminated by '/r/n' ;

假如要導入剛才備份的數據,可以使用load file方法,例如下面的mysql命令,把導出的數據導入了mytable_bak的表中:

load data infile '/home/db_bak2012' into table mytable_bak fields terminated by '|' enclosed by '"' lines terminated by '/r/n' ;

這種方法的好處是,導出的數據可以自己規定格式,並且導出的是純數據,不存在建表信息,你可以直接導入另外一個同數據庫的不同表中,相對於mysqldump比較靈活機動。

本文引用別人的,為了保留給自己或者給瀏覽這用,看完完后可以補充,請評論。


免責聲明!

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



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