1. 程式人生 > >mysql 開發進階篇系列 49 表的資料匯出

mysql 開發進階篇系列 49 表的資料匯出

一.概述

  在資料庫的日常維護中,表的匯入和匯出是很頻繁的操作,本篇講解如何使用匯入功能,並以案例為演示。某些情況下,需要將表裡的資料匯出為某些符號分割的純資料文字,而不是sql語句,比如:(1)用來作為excel顯示。 (2)節省備份空間。(3)為了快速的載入資料,load data的載入速度比普通的sql載入要快20倍以上。為了滿足這些應用,可以使用以下兩種辦法來實現。

  1. 方法1  into outfile

-- 格式如下:
select ... into tablename into outfile 'target_file' [option];

option引數

option

引數說明

Fields terminated by 'string'

字元分隔符,預設為製表符 \t

Fields [optionally] enclosed by 'char'

欄位引用符,如果加optionally選項則只用在char,varchar和test等字元型欄位上,預設不使用引用符

Fields escaped by 'char'

轉義字元,預設為\

Lines  starting by 'string'

每行前都加此字串, 預設' '

Lines terminated by 'string'

行結束符 預設為 \n

    例1:下面是匯出testbackup表資料到資料文字,檔案在伺服器目錄/tmp目錄下。使用字元分隔符(terminated by )為逗號(',') 。使用欄位引用符(enclosed by)為雙引號( ' " ')。

-- 匯出表指令碼
SELECT * FROM test.`testbackup` INTO  OUTFILE  '/tmp/testbackup.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '"'

            例2:發現第一列是數值型,如果不希望欄位兩邊用引號,則語句改為如下指令碼。匯出到testbackup表資料 到伺服器目錄/tmp目錄下(使用OPTIONALLY

選項引用符只用在char, varchar,test等欄位上)

-- 匯出表指令碼
SELECT * FROM test.`testbackup` INTO  OUTFILE  '/tmp/testbackup1.txt' FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '"'

        

  1.1. 轉義字元    into outfile方法匯出來測試轉義字元, 轉義字元是由於含義模糊而需要特殊進行轉換的字元。不同情況下,需要轉義的字元不一樣。在mysql 匯出的資料中需要轉義的字元主要包括以下3類: 轉義字元本身; 欄位分隔符; 記錄分隔符。

-- 下面將testbackup表中的name更新為含(\)的轉義字元以及欄位分隔符(")
UPDATE testbackup SET `name`='\\"##!aa'  WHERE id=1
-- 匯出資料
SELECT * FROM test.`testbackup` INTO  OUTFILE  '/tmp/testbackup2.txt' FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '"'

          上面的匯出結果,因為name中含有轉義字元本身 \ , 欄位引用符(enclosed by)" " ", 因此,輸出的資料中前面加上了轉義字元,變成了\\\# 。

-- 下面將testbackup表中的name更新為含欄位分隔符" , "的字串
UPDATE testbackup SET `name`='\\"#,#,!aa'  WHERE id=1
-- 匯出
SELECT * FROM test.`testbackup` INTO  OUTFILE  '/tmp/testbackup3.txt' FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '"'

        上面的分隔符" , "並沒有轉義,因為字元中兩邊帶有引用符 " " "(雙引號), 所以沒有將它作為欄位分隔符。只是作為一個普通的資料字元來對待。下面繼續將輸出檔案的欄位引用符去掉,這時資料中的" , "將成為轉義字元而加上了" \ "。

-- 匯出
SELECT * FROM test.`testbackup` INTO  OUTFILE  '/tmp/testbackup4.txt' FIELDS TERMINATED BY ',' 

      

    總結: 當匯出命令中包含欄位引用符時(OPTIONALLY ENCLOSED BY ' " '), 資料中含有轉義字元本身( \ )和欄位引用符的字元需要轉義。

               當匯出命令中包含欄位引用符時(OPTIONALLY ENCLOSED BY ' " '), 資料中含有轉義字元本身( \ )和欄位分隔符(TERMINATED BY ' , ')的字元需要轉義。

   2. 方法二  mysqldump

    用 mysqldump 匯出資料為純文字。在第35篇講到了mysqldump資料匯出工具,講到了資料表匯出表結構和資料的可執行T-SQL指令碼,可以用來建立表和表資料。

-- 之前匯出的指令碼檔案最基本的語法是:
mysqldump -uroot -p  dbname > dbname.txt
--這裡繼續講用mysqldump工具匯出純資料的文字。語法如下:mysqldump -uroot -p  target_dir  dbname tablename [option] 

Option 引數

說明

--fields-terminated-by=name

欄位分隔符

--fields-enclosed-by=name

欄位引用符

--fields-optionally-enclosed-by=name

欄位引用符(只能用在char,varchar,text等字元型上)

--fields-escaped-by=name

轉義字元

--lines- terminated-by=name

記錄結束符

-- 匯出 這裡使用了欄位分隔符,和欄位引用符
[[email protected] tmp]# mysqldump -uroot -p -T /tmp/  test testbackup --fields-terminated-by ',' --fields-optionally-enclosed-by '"'

    匯出後產生了二個檔案,(1)是testbackup.sql 的建立表結構指令碼,(2)是testbackup.txt的表資料。        

    總結:使用mysqldump工具除了建立指令碼檔案外(table.sql),和select .. into outfile的選項和語法相似,mysqldump實際呼叫的就是into outfile提供的介面。