コマンドラインからデータをエクスポートしてインポートする、練習をしています。
*phpMyAdminを使ってやりたいのですが、結局文字化けして基本のコマンドラインから
シンプルなデータを作って練習--勉強--しています。 )
http://q.hatena.ne.jp/1353659192
で1度できたと思ったのですが、できてませんでした。
データとエラーメッセージの記述で文字数の制限を超えてしまいますので、
http://test01.1811way.com/archives/45
に、アドバイスいただきたい内容を記述してあります。
よろしくお願いします。
既出の回答にあるように、パスの区切り文字には半角スラッシュ「/」を使ってみてください。
あるいは円記号を使う場合、「\\」と2個続けても大丈夫です。
mysqldumpユーティリティでしたら「\」でも認識したのですが、mysqlは上手く処理できないようです。(※Linuxのパスの区切り文字はスラッシュ「/」ですので、おそらくWindows版だけの問題だと思いますが・・・)
・エクスポート
SELECT * FROM test01 INTO OUTFILE 'c:\\work\\backup001.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
・インポート
LOAD DATA INFILE "c:\\work\\backup001.csv" INTO TABLE test01 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
※改行コードも明示的に指定した方がいいです。(Windows環境であっても何も指定しない場合、デフォルトでLFになります。)
「LOAD DATA INFILE 構文」
http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
LOAD DATA INFILE と SELECT ... INTO OUTFILE ステートメントの両方に対して、FIELDS と LINES 条項の構文は同じです。条項は両方とも任意ですが、もし両方が指定された場合 FIELDS は LINES に先行しなければいけません。
もし FIELDS 条項を指定すると、少なくてもどれか1つを指定する必要はありますが、その各サブ条項 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY、そして ESCAPED BY) もまた任意になります。
もし FIELDS 条項を指定しなければ、デフォルトは、このように書き込んだ場合と同じようになります。FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
もし FIELDS 条項を指定しなければ、デフォルトは、このように書き込んだ場合と同じようになります。LINES TERMINATED BY '\n' STARTING BY ''
言い換えると、インプットを読み込む時、デフォルトは LOAD DATA INFILE が次のように機能するよう働きかけるという事です。
- 改行部分のラインの境界を探してください。
- ライン プリフィックスを飛び越えないでください。
- タブのところでラインをフィールドに分割してください。
- フィールドが引用文字によって囲まれていると思わないでください。
- ‘\’ が先に来るタブ、改行、または ‘\’ を、フィールド値の一部である直定文字として解釈してください。
反対に、デフォルトはアウトプットを書き込む時に SELECT ... INTO OUTFILE が次のように機能するよう働きかけます。
- フィールドの間にタブを書いてください。
- 引用文字でフィールドを囲まないでください。
- フィールド値内で起こるタブのインスタンス、改行、または ‘\’ を避ける為に ‘\’ を利用してください。
- 行の最後に改行を書き込んでください。
バックスラッシュは、MySQL の中では文字列内の拡張文字ですので、FIELDS ESCAPED BY '\\' を書き込むには、単一バックスラッシュだと認識させる為に2つのバックスラッシュを指定しなければいけません。
注意:もしウィンドウズ システム上でテキスト ファイルを生成したら、ウィンドウズのプログラムは通常ラインのターミネータとして2つの文字を利用するので、ファイルを正確に読み込む為には LINES TERMINATED BY '\r\n' を利用しなければいけないでしょう。WordPad のようないくつかのプログラムは、ファイルを書き込む時 \r をライン ターミネータとして利用するでしょう。そのようなファイルを読み込む時は、LINES TERMINATED BY '\r' を利用してください。
「ELECT 構文」
http://dev.mysql.com/doc/refman/5.1/ja/select.html
・mysqldumpでも「--tab=出力するディレクトリのパス」を指定した場合、CSVでの出力が可能です。(SQLファイルも作成されます。)
mysqldump -u ユーザー名 -p パスワード --tab="c:\work" test --fields-terminated-by="," --fields-enclosed-by="\"" --lines-terminated-by="\r\n"
※上記の場合、「c:\work」にSQLとCSVファイルが出力されます。
「mysqldump — データベースバックアッププログラム」
http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html
- --tab=path, -T path
タブによって分けられたデータファイルを生成します。各ダンプされたテーブルごとに、mysqldumpはテーブルを作成するCREATE TABLEステートメントを含むtbl_name.sqlファイルと、そのデータを含むtbl_name.txtファイルを作成します。オプション値はファイルを書き込むディレクトリです。
デフォルトで、.txtデータファイルはカラム値と、各行の最後で新しいラインの間にタブキャラクタを使用してフォーマットされます。このフォーマットは明示的に--fields-xxxと--lines-terminated-byオプションを使用することで特定することができます。
注:このオプションはmysqldumpがmysqldサーバと同一のマシンで作動している場合のみ使用されるべきです。FILE権限を保持しており、サーバはユーザの指定してアファイルをディレクトリ内に書き込む権限を与えられていなければいけません。
カラムの区切り記号、囲み記号、行の終端記号をデフォルトのものと違う文字にしたい場合、明示的に全部指定してしまう方が簡単だと思います。
とりあえずコマンドラインツールによる方法のみですが、必要でしたらphpMyAdminによる方法も追記します。
シングルクォーテーションとダブルクォーテーションは全角ではなく半角で指定して下さい。また、フォルダ区切り文字は半角スラッシュにしてみてください。
SELECT * FROM test01 INTO OUTFILE "c:/work/backup.csv" FIELDS TERMINATED BY ',';
エクスポートと同様です。
LOAD DATA INFILE "c:/work/test01.csv" INTO TABLE test01 FIELDS TERMINATED BY ',';