web-dev-qa-db-ja.com

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

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

1036
MCS

からhttp://www.tech-recipes.com/rx/1475/save-mysql-query-results- int-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などのホスト型または仮想化マシン)からローカルマシンに出力を書き込みたい場合、このソリューションは適していません。

1540
Paul Tomblin
$ mysql your_database --password=foo < my_requests.sql > out.csv

タブ区切りです。真のCSVを得るためにそのようにパイプしてください(ありがとう@therefromhere) 

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

mysql - バッチ、-B

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

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

184
serbaut

これを行うにはかなりひどいやり方があります。どこかで見つけた、信用できない

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
118
Tim Harding

Unix / Cygwin のみ、 'tr'を介してパイプする:

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

N.B .:埋め込みカンマも埋め込みタブも扱いません。

79
strickli

これは私に数回救った。速くてうまくいく!

- バッチ

- 生

例:

Sudo mysql -udemo_user -p -h127.0.0.1 --port=3306 \
   --default-character-set=utf8 --database=demo_database \
   --batch --raw < /var/demo_sql_query.sql > /var/demo_csv_export.csv
36
hrvoj3e

Paul Tomblinによって提供されたOUTFILEソリューションは、ファイルをMySQLサーバー自体に書き込むようにします。そのため、 _ file _ access、およびログインアクセスなどの方法でファイルを取得する場合にのみ機能します。ボックス。

そのようなアクセスがなく、タブ区切りの出力がCSVの代わりになることが合理的な場合(たとえば、最終目的がExcelにインポートすることである場合)、Serbautのソリューション(mysql --batchおよびオプションで--rawを使用).

35
Leland Woodbury

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

32
David Oliver

どうですか? 

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

Mysqlワークベンチ以外のこれまでの解決策はすべて、mysql dbに含まれる可能性のある少なくともいくつかのコンテンツについては不正確で安全でない可能性があります。

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

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

私はこのためのスクリプトを書くことを考えましたが、私がそれを呼んだものについて考えるとすぐに、同じ名前で既存の作品を検索することに気付きました。私はそれを完全には終えていませんが、 https://github.com/robmiller/mysql2csv の解決策は有望に見えます。アプリケーションによっては、SQLコマンドを指定するためのyamlアプローチが魅力的な場合もあれば、そうでない場合もあります。私のUbuntu 12.04ラップトップやDebian Squeezeサーバーに標準装備されているものよりも新しいバージョンのRubyが必要であることにもわくわくしません。はい、私はRVMを使うことができることを知っています、しかし私はむしろそのような単純な目的のためにそれを維持したくありません。

うまくいけば、誰かが適切なツールを指摘するでしょう、それは少しテストをしました。さもなければ私がそれを見つけるか書くときにおそらくこれを更新するでしょう。

25
mc0e

あなたのコマンドラインから、あなたはこれを行うことができます:

mysql -h *hostname* -P *port number* --database=*database_name* -u *username* -p -e *your SQL query* | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > *output_file_name.csv*

クレジット: Amazon RDSからcsvファイルへのテーブルのエクスポート

このページの回答の多くは、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入力フォーマットのコーナーケースをカバーしています。

これはストリーミングアプローチを介して非常に大きなファイルを扱うために改良されるかもしれません。

16
Chris Johnson
  1. 論理:

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

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

13
zloctb

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

それからあなたはあなたがそれを処理せずに単にコピーすることができるCSVフォーマットに常にあるであろうあなたのハードディスク上のファイルを持つでしょう。

9
Jonathan

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

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、...)

それでおしまい!

9
Marty Hirsch

この答えはPythonと人気のあるサードパーティのライブラリ、 PyMySQL を使っています。 Pythonの csv libraryは.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
# https://stackoverflow.com/questions/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)
9
Ben

これまでの答えを詳しく説明するために、次のワンライナーでは単一のテーブルをタブ区切りファイルとしてエクスポートしています。自動化、データベースの毎日のエクスポートなどに適しています。

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    
8
johntellsall

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

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

7
Brian

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);

?>
6
Michael Cole

正確にはCSV形式ではありませんが、 tee command from MySQL clientを使用して、出力をlocalファイルに保存できます。

tee foobar.txt
SELECT foo FROM bar;

noteeを使って無効にすることができます。

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

5

これが私のやり方です。

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

Perlスクリプト(他の場所から切り取ったもの)は、タブスペースのフィールドをCSVに変換するというNiceの仕事をします。

5
extraplanetary

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
lepe

サーバにPHPが設定されている場合は、 mysql2csv を使用して、(実際に有効な)CSVファイルを任意のmysqlクエリにエクスポートできます。参照してください 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 via} _

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
Hirnhamster

このコードを試してください:

SELECT 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'
UNION ALL
SELECT column1, column2,
column3 , column4, column5 FROM demo
INTO OUTFILE '/tmp/demo.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

詳細情報: http://dev.mysql.com/doc/refman/5.1/en/select-into.html

1
Indrajeet Singh

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
minitauros

次のbashスクリプトは私のために働きます。要求されたテーブルのスキーマも取得します。

#!/bin/bash
#
# export mysql data to CSV
#https://stackoverflow.com/questions/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
Wolfgang Fahl

以下はtab-delimited and valid CSV出力を生成します。他のほとんどの回答とは異なり、この手法は、sed、awk、trなどのストリームフィルターを使用せずに、タブ、コンマ、引用符、および改行のエスケープを正しく処理します。この例は、ストリームを使用してリモートmysqlテーブルをローカルsqliteデータベースに直接パイプする方法を示しています。これは、FILE許可またはSELECT INTO OUTFILE許可なしで機能します。読みやすくするために新しい行を追加しました。

mysql -B -C --raw -u 'username' --password='password' --Host='hostname' 'databasename'
-e 'SELECT
    CONCAT('\''"'\'',REPLACE(`id`,'\''"'\'', '\''""'\''),'\''"'\'') AS '\''id'\'',
    CONCAT('\''"'\'',REPLACE(`value`,'\''"'\'', '\''""'\''),'\''"'\'') AS '\''value'\''
    FROM sampledata'
2>/dev/null | sqlite3 -csv -separator $'\t' mydb.db '.import /dev/stdin mycsvtable'

2>/dev/nullは、コマンドラインでパスワードに関する警告を抑制するために必要です。

データにNULLがある場合、クエリでIFNULL()関数を使用できます。

0
humbads

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

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

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

MySQL拡張機能を有効にする独自のPHP設定を使用する必要があるかもしれないので、私は--php-iniスイッチを含めています。 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フィールドとtextフィールドに問題がなく、テキストに改行が含まれることです。これらのフィールドは正しく引用符で囲まれており、それらの中の改行はCSVリーダーによってテキストの一部として解釈され、レコード区切り文字としては解釈されません。 sed などで後で修正するのは難しいことです。

0
user7610

私にとってうまくいったこと:

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';

このスレッドの解決策のどれも私の特定のケースのために働かなかった、私は私のcsv出力でめちゃくちゃになる列の1つの中にかなりのJSONデータを持っていた。同様の問題を抱えている人には、代わりに\ r\nで終わる行を試してください。

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

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