MySQLのクエリ結果をCSV形式で出力するには?

LinuxのコマンドラインからMySQLのクエリを実行して、その結果をCSV形式で出力する簡単な方法はありますか?

今やっているのはこんな感じです。

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

引用符で囲まなければならない列がたくさんある場合や、エスケープしなければならない引用符が結果に含まれている場合は、面倒になります。

ソリューション

From http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

このコマンドを使用すると、カラム名はエクスポートされません。

また、/var/lib/mysql-files/orders.csv は MySQL を実行している server 上にあることに注意してください。MySQLプロセスが実行されているユーザは、選択されたディレクトリへの書き込み権限を持っていなければ、コマンドは失敗します。

リモートサーバー(特にHerokuやAmazon RDSのようなホストマシンや仮想化マシン)からローカルマシンに出力を書き込みたい場合、このソリューションは適していません。

解説 (31)

mysql --batch, -B としています。

タブをカラムセパレータとして使用し、各行を改行して結果を印刷します。 新しい行に表示します。このオプションを使用すると、mysql は履歴ファイルを使用しません。 バッチモードでは、非タブラー出力フォーマットと特殊文字のエスケーピングが 特殊文字がエスケープされます。エスケープを無効にするには raw モードを使用してください。 raw オプションの説明を参照してください。

このモードでは、タブ区切りのファイルが出力されます。カンマ(またはカンマを含む文字列)はエスケープされないので、デリミタをカンマに変更するのは簡単ではありません。

解説 (9)

上記の回答の代わりに、CSVエンジンを使用するMySQLテーブルを用意することもできます。

そうすれば、ハードディスク上に常にCSV形式のファイルがあり、それを処理せずにコピーすることができます。

解説 (2)