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


1183

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

引用符で囲む必要のある列が多数ある場合、またはエスケープする必要のある結果に引用符がある場合は、乱雑になります。


1
REPLACE()クエリで使用して、引用符をエスケープすることができます。
dsm

[このstackoverflowの]で私の答えを見てください[1] [1]:stackoverflow.com/questions/12242772/...
biniam


2
このstackoverflowの質問への受け入れ答えは、おそらく最良の方法である:stackoverflow.com/questions/3760631/mysql-delimiter-question
サミュエル・アスルンド

MariaDBバグトラッカー(jira.mariadb.org/browse/MDEV-12879)で機能リクエストを書きました。投票できます。
Jared Beck

回答:


1760

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を実行しているサーバー上にあることに注意してください。MySQLプロセスを実行しているユーザーには、選択したディレクトリへの書き込み権限が必要です。そうでない場合、コマンドは失敗します。

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


16
@TomasリモートファイルシステムとMySQLにアクセスできる場合、どこかに書き込むことができる必要があります。/ tmpの代わりに、/ home / yourusername / file.csvを試してください。これが失敗し、結果セットがそれほど大きくない場合は、SSHクライアントから出力をコピーしてローカルマシンに貼り付けることができます。
Michael Butler

63
質問はMySQLを指定しており、「標準準拠」ではありません。
ポールトムブリン

35
ヘッダーも含める方法は?
ボグダングシエフ2013年

66
@BogdanGusievでは、実際のクエリの前に「SELECT 'order_id'、 'product_name'、 'qty' UNION」を付加することでヘッダーを含めることができます。最初の選択クエリはヘッダーを返し、2番目のクエリは実際のデータを返します。UNIONが結合します。
petrkotek 2013年

19
@マイケルバトラー:まあ、いや、実際には。Amazon RDS、Heroku、またはその他のホストされたソリューションを使用している場合、他の誰かのサーバーに書き込むだけでは不可能です。
ケンキンダー2013年

459
$ mysql your_database --password=foo < my_requests.sql > out.csv

これはタブ区切りです。そのようにパイプして真のCSVを取得します(@therefromhereに感謝):

... .sql | sed 's/\t/,/g' > out.csv

5
それだけでなく、ローカルファイルシステムへの書き込みとは異なり、リモートデータベースホストからコンテンツを作成できます。
tmarthal 2011

31
カンマ区切りではなく、タブ区切りです。
Flimm 2011

13
@Flimm、フィールドにカンマ/タブが埋め込まれていない場合、結果をパイプして変換できます| sed 's/\t/,/g'
John Carter

111
sedの「修正」は、選択したデータに表示される可能性のあるカンマを補正せず、それに応じて出力される列を歪めます
Joey T

14
否定は...それは今あなたのために働くかもしれない有効ですが、あなたのデータはタブまたはカンマなど。含まれている場合、それは今後もあなたをかむことができ
ジョン・ハント

204

mysql --batch、-B

列区切りとしてタブを使用し、各行を新しい行に表示して結果を印刷します。このオプションを使用すると、mysqlは履歴ファイルを使用しません。バッチモードでは、表形式ではない出力形式と特殊文字のエスケープが行われます。rawモードを使用すると、エスケープが無効になる場合があります。--rawオプションの説明を参照してください。

これにより、タブで区切られたファイルが作成されます。コンマ(またはコンマを含む文字列)はエスケープされないため、区切り文字をコンマに変更することは簡単ではありません。


12
これは推奨されるソリューションです。1)UNIXではタブ区切り値リストが一般的です。2)TSVインポートは、Excel、OpenOfficeスプレッドシートなどのほとんどのインポートシステムでネイティブにサポートされています。3)テキストフィールドの引用文字をエスケープする必要はありません。4 )コマンドラインエクスポートを簡単に
Joey T

5
最初のものの必要性とは違っていないRDSのようなサーバー上の権限を持っているので、これが最善の解決策である
Muayyad Alsadi

8
巧妙なトリック:タブ区切りファイルを.csvではなく.xlsとして保存すると、「テキストからデータ」への変換や地域設定の問題がなく、Excelで開きます。
serbaut 2013

3
@Joey T-タブと改行をエスケープする必要があります。また、フィールドのコンテンツが引用またはエスケープされたフィールドのように見える場合、インポートされたコンテンツは元のコンテンツとは異なる場合があります。
mc0e 2013年

2
あなたは...彼らは、文字列のヌルとして出てくるだろう。.. NULL値に問題があります
ジョナサン・

141

これはかなり危険な方法です。どこかで見つけた、信用できない

mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv

かなりうまくいきます。繰り返しますが、正規表現は書き込みのみを証明します。


正規表現の説明:

  • s ///は、最初の//の間にあるものを2番目の//の間にあるもので置き換えることを意味します//
  • 末尾の「g」は「最初ではなくすべてのインスタンス」を意味する修飾子です
  • ^(このコンテキストでは)は行頭を意味します
  • $(このコンテキストでは)は行末を意味します

したがって、すべてをまとめると:

s/'/\'/          replace ' with \'
s/\t/\",\"/g     replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          at the end of the line place a "
s/\n//g          replace all \n (newline) with nothing

3
-eフラグはまさに私が探していたものです!ありがとう!
Gaurav Gupta

1
この正規表現は非常に単純です。このページの他の多くの回答と同様に、からの出力をクリーンアップするだけmysql -Bです。正規表現を別の行の個々のステートメントに分割した場合、(正規表現を知っている人にとって)理解するのは非常に簡単です。
Mei

7
一見すると、これはかなり壊れているように見えます。コンテンツ内のタブと改行は誤って処理されます。「s / '/ \' /;」シェルコマンドの二重引用符はバックスラッシュを消費するため、何もしません。バックスラッシュが失われる他の多くの同様のバグ。dbフィールドでのバックスラッシュの処理はありません。
mc0e 2013年

1
このコマンドはLinuxでは
正常に機能

6
これは、タブ、バックスラッシュ、","その他の多くを含むテキストフィールドがある場合に機能しなくなります。正規表現がありません。この問題を解決する方法
エイダン

93

Unix / Cygwinのみ、「tr」を介してパイプします

mysql <database> -e "<query here>" | tr '\t' ',' > data.csv

注意:これは埋め込まれたコンマも埋め込まれたタブも扱いません。


53

これは私を数回救いました。高速で動作します!

--batch タブを列の区切りとして使用し、各行を新しい行に出力します。

--raw は文字のエスケープを無効にします(\ n、\ t、\ 0、\)

例:

mysql -udemo_user -p -h127.0.0.1 --port=3306 \
   --default-character-set=utf8mb4 --database=demo_database \
   --batch --raw < /tmp/demo_sql_query.sql > /tmp/demo_csv_export.tsv

完全を期すために、csvに変換できます(ただし、タブがフィールド値の内部にある可能性があるので注意してください(テキストフィールドなど))

tr '\t' ',' < file.tsv > file.csv


4
何か不足している場合を除き、CSVファイルではなくTSVファイルが作成されます...
PressingOnAlways

@PressingOnAlwaysはい。MySQL doc quote: "タブをカラムセパレーターとして使用し、各行を新しい行に出力します。しかし、解析は区切り文字の問題にはなりません。私はクライアント用にExcelファイルを作成するために使用しました。
hrvoj3e 2016

39

Paul Tomblinによって提供されたOUTFILEソリューションにより、MySQLサーバー自体にファイルが書き込まれるため、これはFILEがある場合にのみ機能しますアクセスと、ログインアクセスまたはそのボックスからファイルを取得するその他の手段機能します。

そのようなアクセス権がなく、タブ区切りの出力がCSVの妥当な代替手段である場合(たとえば、最終目標がExcelへのインポートである場合)、セルボーのソリューション(mysql --batchおよびオプションでを使用--raw)が適しています。


36

MySQL WorkbenchはレコードセットをCSVにエクスポートでき、フィールドのカンマを非常にうまく処理するようです。CSVはOpenOfficeで正常に開きます。


2
100万人のデービッドに感謝します。データのHTMLコンテンツに対して改行を適切に出力するために3時間を費やした後、MySQLワークベンチを使用し、2分でCSVファイルの準備が整いました。
mr-euro

XMLとしても保存できることがわかりました。これはすばらしいことです。XSLTを使用してこのXMLをターゲットアプリケーションへのインポートに適したCSVファイルに変換することで、あるアプリケーションから別のアプリケーションに移行したいと思っています。
David Oliver

mysqlワークベンチは、インポートおよびエクスポート機能に最適なオプションです。
シジャガニ2015

1
mysqlワークベンチを使用して50万行以上を正常にエクスポートしたので、大きなファイルが問題にならないようです。クエリを実行する前に選択制限を必ず削除する必要があります。また、my.iniファイルの次の値を増やす必要がある場合もあります。max_allowed_pa​​cket= 500M、net_read_timeout = 600、net_write_timeout = 600
Vincent

3
MySQLワークベンチでは、CSVでデータをエクスポートするときに恥ずかしいメモリリークが発生します。100万または200万行以上の大きなデータセットがある場合、12 GBのRAM(私のLinuxマシンでテスト済み)では不十分で、メモリがクリアされません。それを殺すか、止めてください。大きなデータセットの場合、これは解決策ではありません。
オスティコ

33

どうですか:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv

2
私はこれが本当に好きです。それはずっときれいで、私はawkの使用が好きです。しかし、私はおそらくこれでうまくいったでしょう: mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Josh

7
これは、スペースのあるフィールド値では失敗します。
Barun Sharma

29

MySQLワークベンチを除く、これまでのすべてのソリューションは正しくありませんが、mysql dbの少なくとも一部のコンテンツについては、安全性(つまりセキュリティの問題)が発生する可能性があります。

MYSQLワークベンチ(および同様にPHPMyAdmin)は正式に正しいソリューションを提供しますが、出力をユーザーの場所にダウンロードするように設計されています。データのエクスポートの自動化などにはあまり役立ちません。

の出力から確実に正しいcsvを生成することはできません mysql -B -e 'SELECT ...'ことはできません。フィールドでキャリッジリターンと空白をエンコードできないためです。mysqlへの '-s'フラグはバックスラッシュエスケープを行い、正しい解決策につながる可能性があります。ただし、スクリプト言語(bashではなく、適切な内部データ構造を持つもの)と、エンコーディングの問題がすでに注意深く解決されているライブラリを使用する方がはるかに安全です。

このためのスクリプトを書くことを考えましたが、私がそれを何と呼ぶか​​を考えるとすぐに、同じ名前で既存の作品を検索するようになりました。私はそれを徹底的に調べていませんが、https://github.com/robmiller/mysql2csvのソリューションは有望に見えます。アプリケーションによっては、SQLコマンドを指定するためのyamlアプローチが魅力的な場合とそうでない場合があります。また、Ubuntu 12.04ラップトップまたはDebian Squeezeサーバーに標準で付属しているものよりも新しいバージョンのrubyの要件にわくわくしていません。はい、私はRVMを使用できることを知っていますが、そのような単純な目的のためにそれを維持したくないのです。

誰かが適切なツールを指摘してくれるといいのですが、それは少しテストされています。それ以外の場合は、おそらくこれを見つけたり書き込んだりしたときに更新します。


1
そうです、テーブル内の複雑な文字列については、bashだけでなく、適切なライブラリを使用する必要があります。nodejsには、この種のアクションのためのより良いソリューションがあると思います。この例のように
イェヤ2016

1
こんにちは、良い答えです。stackoverflow.com/ a / 35123787/1504300の下に提案されているpythonソリューションへのリンクを追加します。私はあなたの投稿を編集しようとしましたが、編集は拒否されました
本当に素敵な

26

このページの回答の多くは、CSV形式で発生する可能性のある一般的なケースを処理しないため、弱いものです。たとえば、フィールドに埋め込まれたカンマと引用符、および常に最終的に表示されるその他の条件。すべての有効なCSV入力データに対して機能する一般的なソリューションが必要です。

Pythonでのシンプルで強力なソリューションを次に示します。

#!/usr/bin/env python

import csv
import sys

tab_in = csv.reader(sys.stdin, dialect=csv.excel_tab)
comma_out = csv.writer(sys.stdout, dialect=csv.excel)

for row in tab_in:
    comma_out.writerow(row)

そのファイルtab2csvに名前を付け、パスに配置し、実行権限を付与して、次のように使用します。

mysql OTHER_OPTIONS --batch --execute='select * from whatever;' | tab2csv > outfile.csv

PythonのCSV処理関数は、CSV入力形式のコーナーケースをカバーします。

これは、ストリーミングアプローチを介して非常に大きなファイルを処理するように改善できます。


8
さらに信頼できるソリューションは、実際にPythonを使用してデータベースに接続することです。そうすると、より大きなデータセットを処理するために必要な処理(チャンク結果、ストリーミングなど)をより簡単に行うことができます。
Josh Rumbut 16

@JoshRumbut、本当に遅いですが、コメントを補足するためにstackoverflow.com/a/41840534/2958070を作成しました
Ben


17
  1. 論理:

CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;

CSVテーブルを作成すると、サーバーはデータベースディレクトリにテーブル形式のファイルを作成します。ファイルはテーブル名で始まり、拡張子は.frmです。ストレージエンジンはデータファイルも作成します。その名前はテーブル名で始まり、.CSV拡張子が付いています。データファイルはプレーンテキストファイルです。データをテーブルに格納すると、ストレージエンジンはデータファイルにカンマ区切り値形式でデータを保存します。


1
これは他の調整を必要とせずに正しいのでいいです。
Andrew Schulman、2018年

13

この回答では、Pythonと人気のあるサードパーティライブラリであるPyMySQLを使用しています。Pythonのcsvライブラリは多くのさまざまなフレーバーを正しく処理するのに十分強力で.csvあり、他の回答はPythonコードを使用してデータベースと対話しないため、これを追加します。

import contextlib
import csv
import datetime
import os

# https://github.com/PyMySQL/PyMySQL
import pymysql

SQL_QUERY = """
SELECT * FROM my_table WHERE my_attribute = 'my_attribute';
"""

# embedding passwords in code gets nasty when you use version control
# the environment is not much better, but this is an example
# /programming/12461484
SQL_USER = os.environ['SQL_USER']
SQL_PASS = os.environ['SQL_PASS']

connection = pymysql.connect(host='localhost',
                             user=SQL_USER,
                             password=SQL_PASS,
                             db='dbname')

with contextlib.closing(connection):
    with connection.cursor() as cursor:
        cursor.execute(SQL_QUERY)
        # Hope you have enough memory :)
        results = cursor.fetchall()

output_file = 'my_query-{}.csv'.format(datetime.datetime.today().strftime('%Y-%m-%d'))
with open(output_file, 'w', newline='') as csvfile:
    # http://stackoverflow.com/a/17725590/2958070 about lineterminator
    csv_writer = csv.writer(csvfile, lineterminator='\n')
    csv_writer.writerows(results)

Pythonを使用した回答はすでに提供されています。stackoverflow.com/a/35123787/5470883
Alexander Baltasar 2017年

4
@AlexanderBaltasar、そうですね、それは便利に見えますが、データベースとのやり取りにPythonコードを使用していません。その質問についてのコメントを参照してください。
Ben

11

これは簡単で、バッチモードや出力ファイルを必要とせずに何でも機能します。

select concat_ws(',',
    concat('"', replace(field1, '"', '""'), '"'),
    concat('"', replace(field2, '"', '""'), '"'),
    concat('"', replace(field3, '"', '""'), '"'))

from your_table where etc;

説明:

  1. 交換する"""、各フィールドに- >replace(field1, '"', '""')
  2. 各結果を引用符で囲みます-> concat('"', result1, '"')
  3. 引用された各結果の間にカンマを配置します-> concat_ws(',', quoted1, quoted2, ...)

それでおしまい!


1
NULL値はによってスキップされるconcat_ws()ため、列が一致しないことに注意してください。これを回避するには、代わりに空の文字列IFNULL(field, '')を使用します:(またはその他の表現に使用するものNULL
Marco Roy

10

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

次に、ハードディスクに常にCSV形式のファイルを作成します。このファイルは、処理せずにコピーできます。


1
ファイルサイズ/書き込み/読み取り/などに関して、これの制限は何ですか?
Zach Smith、

8

以前の回答を拡張するために、次のワンライナーは単一のテーブルをタブ区切りファイルとしてエクスポートします。自動化、データベースの毎日のエクスポートなどに適しています。

mysql -B -D mydatabase -e 'select * from mytable'

便利なことに、同じ手法を使用してMySQLのテーブルを一覧表示し、単一のテーブルのフィールドを記述することができます。

mysql -B -D mydatabase -e 'show tables'

mysql -B -D mydatabase -e 'desc users'

Field   Type    Null    Key Default Extra
id  int(11) NO  PRI NULL    auto_increment
email   varchar(128)    NO  UNI NULL    
lastName    varchar(100)    YES     NULL    
title   varchar(128)    YES UNI NULL    
userName    varchar(128)    YES UNI NULL    
firstName   varchar(100)    YES     NULL    

4
CSVに変換するには:mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
DSimon 2015年

7
sed -e 's/\t/,/g'データにコンマやタブが含まれていないことが確実な場合にのみ、安全に使用できます。
2015年

7

user7610に基づいて、これを行う最善の方法を次に示します。とmysql outfile、ファイルの所有権と上書きの問題の60分がありました。

クールではありませんが、5分で動作しました。

php csvdump.php localhost root password database tablename > whatever-you-like.csv

<?php

$server = $argv[1];
$user = $argv[2];
$password = $argv[3];
$db = $argv[4];
$table = $argv[5];

mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());

// fetch the data
$rows = mysql_query('SELECT * FROM ' . $table);
$rows || die(mysql_error());


// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

// output the column headings

$fields = [];
for($i = 0; $i < mysql_num_fields($rows); $i++) {
    $field_info = mysql_fetch_field($rows, $i);
    $fields[] = $field_info->name;
}
fputcsv($output, $fields);

// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);

?>

1
素晴らしく、クリーンで、すぐに動作します。この環境でPHPを実行できる場合、これは優れたソリューションです。
John Fiala

7

また、Bashコマンドラインでクエリを実行している場合、このtrコマンドを使用して、デフォルトのタブを任意の区切り文字に置き換えることができると思います。

$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,


5

これが私がすることです:

echo $QUERY | \
  mysql -B  $MYSQL_OPTS | \
  perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' | \
  mail -s 'report' person@address

perlスクリプト(他の場所から抜粋)は、タブで区切られたフィールドをCSVに変換する優れた機能を果たします。


これは素晴らしい。わずかな改善は、数字以外のすべてを引用することかもしれませんperl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '-あなたは引用しないでしょう1.2.3
artfulrobot 2017年

5

正確にはCSV形式ではありませんが、MySQL クライアントからのteeコマンドを使用して、出力をローカルファイルに保存できます。

tee foobar.txt
SELECT foo FROM bar;

を使用して無効にできnoteeます。

の問題SELECT … INTO OUTFILE …;は、サーバーでファイルを書き込む許可が必要なことです。


.txtの代わりに.csv拡張子が使用されている場合、認識すべきフォーマットの問題はありますか?
datalifenyc 2018年

@myidealab書式設定の問題は、カンマなどがエスケープされていないために発生します。CSVはプレーンテキスト形式であるため、拡張機能を入れ替えるだけでフォーマットの問題は発生しません。
jkmartindale

3

Timが投稿したソリューションを使用して、プロセスを容易にするためにこのbashスクリプトを作成しました(rootパスワードが要求されますが、スクリプトを簡単に変更して他のユーザーに要求することができます)。

#!/bin/bash

if [ "$1" == "" ];then
    echo "Usage: $0 DATABASE TABLE [MYSQL EXTRA COMMANDS]"
    exit
fi

DBNAME=$1
TABLE=$2
FNAME=$1.$2.csv
MCOMM=$3

echo "MySQL password:"
stty -echo
read PASS
stty echo

mysql -uroot -p$PASS $MCOMM $DBNAME -B -e "SELECT * FROM $TABLE;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $FNAME

次の名前のファイルを作成します:database.table.csv


3

サーバーでPHPを設定している場合は、mysql2csvを使用して、任意のmysqlクエリ用の(実際に有効な)CSVファイルをエクスポートできます。MySQLで私の答えをください-SELECT * INTO OUTFILE LOCAL?もう少しコンテキスト/情報のために。

オプション名を維持しようとしたmysqlので、--fileおよび--queryオプションを指定するだけで十分です:

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

「インストール」mysql2csvを経由して

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(要点のコンテンツをダウンロードし、チェックサムをチェックして実行可能にします)。


3

私のために働いたもの:

SELECT *
FROM students
WHERE foo = 'bar'
LIMIT 0,1200000
INTO OUTFILE './students-1200000.csv'
FIELDS TERMINATED BY ',' ESCAPED BY '"'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';

このスレッドの解決策はどれも私の特定のケースでは機能しませんでした。列の1つにかなりのjsonデータがあり、csv出力でめちゃくちゃになります。同様の問題がある場合は、代わりに\ r \ nで終了する行を試してください。

また、Microsoft Excelでcsvを開こうとする場合の別の問題として、1つのセルが保持できる32,767文字の制限があることに注意してください。これを超えると、下の行にオーバーフローします。列のどのレコードに問題があるかを特定するには、以下のクエリを使用します。その後、それらのレコードを切り捨てるか、必要に応じて処理できます。

SELECT id,name,CHAR_LENGTH(json_student_description) AS 'character length'
FROM students
WHERE CHAR_LENGTH(json_student_description)>32767;

2

そのときにエラーが発生する場合はsecure-file-priv、宛先ファイルの場所を内部に移動したC:\ProgramData\MySQL\MySQL Server 8.0\Uploads後も、クエリの後に

SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

が機能していない場合は\、クエリから(バックスプラッシュ)を変更するだけです/(forwardsplash)に

そしてそれはうまくいきます!

例:

SELECT * FROM出席INTO OUTFILE 'C:/ ProgramData / MySQL / MySQL Server 8.0 / Uploads / FileName.csv' FIELDS TERMINATED BY '、' ENCLOSED BY '"' LINES TERMINATED BY '\ n';

成功したクエリを実行するたびに、新しいcsvファイルが生成されます。かっこいい?


1

https://stackoverflow.com/a/5395421/2841607に触発された、CSVダンプへの単純なクエリを実行するための小さなbashスクリプト。

#!/bin/bash

# $1 = query to execute
# $2 = outfile
# $3 = mysql database name
# $4 = mysql username

if [ -z "$1" ]; then
    echo "Query not given"
    exit 1
fi

if [ -z "$2" ]; then
    echo "Outfile not given"
    exit 1
fi

MYSQL_DB=""
MYSQL_USER="root"

if [ ! -z "$3" ]; then
    MYSQL_DB=$3
fi

if [ ! -z "$4" ]; then
    MYSQL_USER=$4
fi

if [ -z "$MYSQL_DB" ]; then
    echo "Database name not given"
    exit 1
fi

if [ -z "$MYSQL_USER" ]; then
    echo "Database user not given"
    exit 1
fi

mysql -u $MYSQL_USER -p -D $MYSQL_DB -B -s -e "$1" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $2
echo "Written to $2"

1

次のbashスクリプトは私にとってはうまくいきます。オプションで、要求されたテーブルのスキーマも取得します。

#!/bin/bash
#
# export mysql data to CSV
#/programming/356578/how-to-output-mysql-query-results-in-csv-format
#

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'
red='\033[0;31m'
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}


#
# error
#
# show the given error message on stderr and exit
#
#   params:
#     1: l_msg - the error message to display
#
error() {
  local l_msg="$1"
  # use ansi red for error
  color_msg $red "Error:" 1>&2
  color_msg $red "\t$l_msg" 1>&2
  usage
}

#
# display usage 
#
usage() {
  echo "usage: $0 [-h|--help]" 1>&2
  echo "               -o  | --output      csvdirectory"    1>&2
  echo "               -d  | --database    database"   1>&2
  echo "               -t  | --tables      tables"     1>&2
  echo "               -p  | --password    password"   1>&2
  echo "               -u  | --user        user"       1>&2
  echo "               -hs | --host        host"       1>&2
  echo "               -gs | --get-schema"             1>&2
  echo "" 1>&2
  echo "     output: output csv directory to export mysql data into" 1>&2
  echo "" 1>&2
  echo "         user: mysql user" 1>&2
  echo "     password: mysql password" 1>&2
  echo "" 1>&2
  echo "     database: target database" 1>&2
  echo "       tables: tables to export" 1>&2
  echo "         host: host of target database" 1>&2
  echo "" 1>&2
  echo "  -h|--help: show help" 1>&2
  exit 1
}

#
# show help 
#
help() {
  echo "$0 Help" 1>&2
  echo "===========" 1>&2
  echo "$0 exports a csv file from a mysql database optionally limiting to a list of tables" 1>&2
  echo "   example: $0 --database=cms --user=scott --password=tiger  --tables=person --output person.csv" 1>&2
  echo "" 1>&2
  usage
}

domysql() {
  mysql --host $host -u$user --password=$password $database
}

getcolumns() {
  local l_table="$1"
  echo "describe $l_table" | domysql | cut -f1 | grep -v "Field" | grep -v "Warning" | paste -sd "," - 2>/dev/null
}

host="localhost"
mysqlfiles="/var/lib/mysql-files/"

# parse command line options
while true; do
  #echo "option $1"
  case "$1" in
    # options without arguments
    -h|--help) usage;;
    -d|--database)     database="$2" ; shift ;;
    -t|--tables)       tables="$2" ; shift ;;
    -o|--output)       csvoutput="$2" ; shift ;;
    -u|--user)         user="$2" ; shift ;;
    -hs|--host)        host="$2" ; shift ;;
    -p|--password)     password="$2" ; shift ;;
    -gs|--get-schema)  option="getschema";; 
    (--) shift; break;;
    (-*) echo "$0: error - unrecognized option $1" 1>&2; usage;;
    (*) break;;
  esac
  shift
done

# checks
if [ "$csvoutput" == "" ]
then
  error "ouput csv directory not set"
fi
if [ "$database" == "" ]
then
  error "mysql database not set"
fi
if [ "$user" == "" ]
then
  error "mysql user not set"
fi
if [ "$password" == "" ]
then
  error "mysql password not set"
fi

color_msg $blue "exporting tables of database $database"
if [ "$tables" = "" ]
then
tables=$(echo "show tables" | domysql)
fi

case $option in
  getschema) 
   rm $csvoutput$database.schema
   for table in $tables
   do
     color_msg $blue "getting schema for $table"
     echo -n "$table:" >> $csvoutput$database.schema
     getcolumns $table >> $csvoutput$database.schema
   done  
   ;;
  *)
for table in $tables
do
  color_msg $blue "exporting table $table"
  cols=$(grep "$table:" $csvoutput$database.schema | cut -f2 -d:)
  if [  "$cols" = "" ]
  then
    cols=$(getcolumns $table)
  fi
  ssh $host rm $mysqlfiles/$table.csv
cat <<EOF | mysql --host $host -u$user --password=$password $database 
SELECT $cols FROM $table INTO OUTFILE '$mysqlfiles$table.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
EOF
  scp $host:$mysqlfiles/$table.csv $csvoutput$table.csv.raw
  (echo "$cols"; cat $csvoutput$table.csv.raw) > $csvoutput$table.csv
  rm $csvoutput$table.csv.raw
done
  ;;
esac

1

同じ問題が発生し、RDSだったのでPaul's Answerは選択肢になりませんでした。データにカンマとタブが埋め込まれているため、タブをカンマで置き換えることはできませんでした。私は、ことがわかっmycliドロップイン代替のmysqlクライアントがサポートするCSV出力用のボックスoutofである--csvフラグ

mycli db_name --csv -e "select * from flowers" > flowers.csv

1

ファイルをエクスポートしようとしたときにこのエラーが発生した場合

エラー1290(HY000):MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません

そして、あなたはこのエラーを解決することができません。このpythonスクリプトを実行するだけで1つのことができます

import mysql.connector
import csv

con = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="Your Password"
)

cur = con.cursor()

cur.execute("USE DbName")
cur.execute("""
select col1,col2 from table
where <cond>
""")

with open('Filename.csv',mode='w') as data:
    fieldnames=["Field1","Field2"]
    writer=csv.DictWriter(data,fieldnames=fieldnames)
    writer.writeheader()
    for i in cur:
        writer.writerow({'Field1':i[0],'Field2':i[1]})

Stack Overflowへようこそ!これは質問の答えにはなりません。stackoverflow.com/help/how-to-answerを確認してください。
スティーブンウェイド

0

使用しているマシンにPHPがインストールされている場合は、そのためのPHPスクリプトを作成できます。PHPのインストールにMySQL拡張がインストールされている必要があります。

次のように、コマンドラインからPHPインタープリターを呼び出すことができます。

php --php-ini path/to/php.ini your-script.php

--php-iniMySQL拡張を有効にする独自のPHP設定を使用する必要がある場合があるため、スイッチを含めています。PHP 5.3.0以降では、この拡張機能はデフォルトで有効になっているため、構成を使用して有効にする必要はありません。

次に、通常のPHPスクリプトと同じようにエクスポートスクリプトを記述できます。

<?php
    #mysql_connect("localhost", "username", "password") or die(mysql_error());
    mysql_select_db("mydb") or die(mysql_error());

    $result = mysql_query("SELECT * FROM table_with_the_data p WHERE p.type = $typeiwant");

    $result || die(mysql_error());

    while($row = mysql_fetch_row($result)) {
      $comma = false;
      foreach ($row as $item) {

        # Make it comma separated
        if ($comma) {
          echo ',';
        } else {
          $comma = true;
        }

        # Quote the quotes
        $quoted = str_replace("\"", "\"\"", $item);

        # Quote the string
        echo "\"$quoted\"";
      }
        echo "\n";
    }
?>

この方法の利点は、改行を含むテキストを持つvarcharフィールドとテキストフィールドで問題が発生しないことです。これらのフィールドは正しく引用され、それらの改行は、CSVリーダーによって、レコードの区切り文字ではなく、テキストの一部として解釈されます。これは、後でsedなどで修正するのが難しいものです。


1
不必要に複雑になるどころか、これは正しいと思われる方向に向かう唯一の解決策です-少し作業は増えますが。CSVは最初に表示されるよりも複雑であり、さまざまな間違いを犯しています。たとえば、元のバックスラッシュ。CSVへの書き込みに関するすべての問題を解決したライブラリを使用することをお勧めします。
mc0e 2013年

@ mc0e通常、引用符を2重にするか、引用符をエスケープします。二重引用符を付けることにしたので、エスケープ文字は必要ありません。ソフトウェアによって、CSVの詳細に関する考え方が異なります。たとえば、MySQLのLOAD DATAは確かに\をエスケープ文字として扱いますが、Open Office Calcはそうしません。回答を書いたとき、データをスプレッドシートにエクスポートしていました。
user7610 2015年

1
私のコードはその日にデータセットをエクスポートするために必要なすべてを処理します;)あなたの答えも正しい方向へのステップですが、そこの最初のコメントが言うように、それは1)スクリプトから直接sqlデータベースに接続する必要があります同様に2)適切なcsvライブラリを使用します。
user7610 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.