into outfile/load data infile


mysqlのinto outfile/load data infileは、データのインポートエクスポートに使用できます.
mysqldumpとは異なり、into outfileは直接データを問題に出力し、データ自体は暗号化されておらず、ファイル自体にはddlテーブル文もinsert文もありません.テーブルデータをcsvテーブルファイルに導くことに相当
 
select .. into outfile構文:
SELECT
...

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

load data infile ..into table構文
LOAD DATA
    [LOW_PRIORITY | CONCURRENT] [LOCAL]
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT}
        [, col_name={expr | DEFAULT}] ...]

 
文法の選択肢はたくさんありますが、fields terminated by','enclosed by'`'lines terminated by'r'が重要です.
フィールドterminated by','でフィールドを分割
enclosed by'`'はフィールドを囲み、encloseがインポートされない場合、データ自体に番号があり、識別がずれてしまうなどの識別フィールドの問題に遭遇します.
lines terminated by'r'r'rは改行で、rはlinuxの改行で、改行がなければデータをインポートするのは1行だけかもしれません
もちろん記号はカスタマイズされていますが、できるだけデータに現れない文字を使います.
 
テストのエクスポート:
mysql> select * from lzldb.test1 into outfile '/tmp/lzldb_test1.txt' fields terminated by ','  enclosed by '`' lines terminated by '\r
' ; Query OK, 7 rows affected (0.01 sec)
mysql> create table lzldb.test2 like lzldb.test1;
Query OK, 0 rows affected (0.02 sec)
mysql> load data infile '/tmp/lzldb_test1.txt' into table lzldb.test2 fields  terminated by ','  enclosed by '`' lines terminated by '\r
'   ; Query OK, 7 rows affected (0.00 sec) Records: 7  Deleted: 0  Skipped: 0  Warnings: 0