web-dev-qa-db-de.com

Wie werden MySQL-Abfrageergebnisse im CSV-Format ausgegeben?

Gibt es eine einfache Möglichkeit, eine MySQL-Abfrage über die Linux-Befehlszeile auszuführen und die Ergebnisse im Format CSV auszugeben?

Folgendes mache ich jetzt:

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

Es wird unübersichtlich, wenn viele Spalten von Anführungszeichen umgeben werden müssen oder wenn in den Ergebnissen Anführungszeichen stehen, die mit Escapezeichen versehen werden müssen.

1004
MCS

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

Mit diesem Befehl werden Spaltennamen nicht exportiert.

Beachten Sie auch, dass sich /var/lib/mysql-files/orders.csv auf dem server befindet, auf dem MySQL ausgeführt wird. Der Benutzer, unter dem der MySQL-Prozess ausgeführt wird, muss über Berechtigungen zum Schreiben in das ausgewählte Verzeichnis verfügen, andernfalls schlägt der Befehl fehl.

Wenn Sie die Ausgabe von einem Remote-Server (insbesondere einer gehosteten oder virtualisierten Maschine wie Heroku oder Amazon RDS) auf Ihren lokalen Computer schreiben möchten, ist diese Lösung nicht geeignet.

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

Welches ist tabulatorgetrennt. Pipe es so, um eine echte CSV zu erhalten (danke @therefromhere): 

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

mysql --batch, -B

Drucken Sie die Ergebnisse mithilfe der Tabulatortaste als Spaltentrennzeichen, wobei sich jede Zeile in einer .__ befindet. Neue Zeile. Bei dieser Option verwendet mysql nicht die History-Datei . Der Stapelmodus führt zu einem nicht-tabellarischen Ausgabeformat und zum Umgehen von spezielle Charaktere. Die Flucht kann im Raw-Modus deaktiviert werden. sehen die Beschreibung für die Option --raw.

Dadurch erhalten Sie eine durch Tabulatoren getrennte Datei. Da Kommas (oder Zeichenfolgen, die ein Komma enthalten) nicht maskiert werden, ist es nicht einfach, das Trennzeichen in ein Komma zu ändern.

184
serbaut

Hier ist eine ziemlich knackige Art, es zu tun. Fand es irgendwo, kann keinen Kredit annehmen

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

Funktioniert ziemlich gut. Wieder einmal beweist ein Regex nur das Schreiben.


Regex-Erklärung:

  • s /// bedeutet, was zwischen dem ersten // ist, was zwischen dem zweiten // ist.
  • das "g" am Ende ist ein Modifikator, der "alle Instanzen, nicht nur die ersten" bedeutet.
  • ^ (in diesem Zusammenhang) bedeutet Zeilenanfang
  • $ (in diesem Zusammenhang) bedeutet Zeilenende

Also alles zusammen:

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 only, Pipe durch 'tr':

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

NB .: Dies behandelt weder eingebettete Kommas noch eingebettete Tabulatoren.

79
strickli

Das hat mich ein paar Mal gerettet. Schnell und es funktioniert!

--Stapel

--raw

Beispiel:

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

Die von Paul Tomblin bereitgestellte OUTFILE-Lösung bewirkt, dass eine Datei auf den MySQL-Server geschrieben wird. Dies funktioniert nur, wenn Sie über die Option FILE verfügen sowie über den Anmeldezugriff oder andere Methoden zum Abrufen der Datei Box.

Wenn Sie nicht über einen solchen Zugriff verfügen und die tabulatorgetrennte Ausgabe einen sinnvollen Ersatz für CSV darstellt (z. B. wenn Ihr Endziel der Import in Excel ist), ist die Lösung von Serbaut (mit mysql --batch und optional --raw) der richtige Weg.

35
Leland Woodbury

MySQL Workbench kann Recordsets in CSV exportieren, und es scheint, dass Kommas in Feldern sehr gut verarbeitet werden. Der CSV öffnet sich in OpenOffice Fine.

32
David Oliver

Wie wäre es mit: 

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

Bis auf die Mysql-Workbench-Version sind alle hier enthaltenen Lösungen fehlerhaft und möglicherweise unsicher (dh Sicherheitsprobleme) für mindestens einige mögliche Inhalte in der MySQL-Datenbank.

Mysql Workbench (und in ähnlicher Weise auch PHPMyAdmin) bieten eine formal korrekte Lösung, sind jedoch für das Herunterladen der Ausgabe an den Speicherort eines Benutzers gedacht. Sie sind nicht so nützlich für Dinge wie die Automatisierung des Datenexports.

Es ist nicht möglich, zuverlässig korrekte CSV-Werte aus der Ausgabe von mysql -B -e 'SELECT ...' zu generieren, da dies keine Zeilenumbrüche und Leerzeichen in Feldern codieren kann. Das '-s'-Flag von mysql führt eine Backslash-Escape-Operation durch und kann zu einer korrekten Lösung führen. Die Verwendung einer Skriptsprache (eine mit anständigen internen Datenstrukturen, dh keine Bash) und Bibliotheken, in denen die Codierungsprobleme bereits sorgfältig ausgearbeitet wurden, ist jedoch weitaus sicherer.

Ich dachte darüber nach, ein Skript dafür zu schreiben, aber sobald ich darüber nachdachte, wie ich es nennen würde, fiel es mir ein, nach bereits existierenden Werken mit demselben Namen zu suchen. Während ich es nicht gründlich durchgearbeitet habe, sieht die Lösung unter https://github.com/robmiller/mysql2csv vielversprechend aus. Abhängig von Ihrer Anwendung kann der yaml-Ansatz zur Angabe der SQL-Befehle jedoch möglicherweise nicht attraktiv sein. Ich bin auch nicht begeistert von der Anforderung nach einer neueren Version von Ruby, die standardmäßig mit meinem Ubuntu 12.04-Laptop oder meinen Debian-Squeeze-Servern geliefert wird. Ja, ich weiß, dass ich RVM verwenden könnte, aber ich möchte das nicht für einen so einfachen Zweck beibehalten.

Hoffentlich wird jemand auf ein geeignetes Werkzeug hinweisen, das hat ein wenig getestet. Ansonsten werde ich das wahrscheinlich aktualisieren, wenn ich eins finde oder schreibe.

25
mc0e

Von Ihrer Befehlszeile aus können Sie Folgendes tun:

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*

Credits:Exportieren einer Tabelle aus Amazon RDS in eine CSV-Datei

Viele der Antworten auf dieser Seite sind schwach, da sie nicht den generellen Fall des CSV-Formats behandeln. z.B. Kommas und Zitate, die in Feldern und anderen Bedingungen eingebettet sind, die immer wieder auftreten Wir benötigen eine allgemeine Lösung, die für alle gültigen CSV-Eingabedaten geeignet ist.

Hier ist eine einfache und starke Lösung in 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)

Benennen Sie diese Datei tab2csv, geben Sie sie in Ihren Pfad ein, erteilen Sie ihr Ausführungsberechtigungen und verwenden Sie sie wie folgt:

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

Die Python CSV-Handhabungsfunktionen behandeln Eckfälle für CSV-Eingabeformate.

Dies könnte verbessert werden, um sehr große Dateien über einen Streaming-Ansatz zu verarbeiten.

16
Chris Johnson
  1. logik :

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

Wenn Sie eine CSV-Tabelle erstellen, erstellt der Server eine Tabellenformatdatei im Datenbankverzeichnis. Die Datei beginnt mit dem Tabellennamen und hat die Erweiterung .frm. Die Speicher-Engine erstellt auch eine Datendatei. Sein Name beginnt mit dem Tabellennamen und hat die Erweiterung .CSV. Die Datendatei ist eine reine Textdatei. Wenn Sie Daten in der Tabelle speichern, speichert die Speicher-Engine diese in der Datendatei im Format kommagetrennter Werte.

13
zloctb

Alternativ zur obigen Antwort können Sie eine MySQL-Tabelle verwenden, die die CSV-Engine verwendet.

Dann haben Sie eine Datei auf Ihrer Festplatte, die immer in einem CSV-Format vorliegt, das Sie einfach ohne Bearbeitung kopieren können.

9
Jonathan

Dies ist einfach und funktioniert ohne Batch-Modus oder Ausgabedateien:

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

from your_table where etc;

Erläuterung:

  1. Ersetzen Sie in jedem Feld "durch" "-> ersetzen Sie (Feld1, '' ',' '' ')
  2. Umgeben Sie jedes Ergebnis in Anführungszeichen -> concat ('' ', result1,' '')
  3. Setzen Sie ein Komma zwischen jedes zitierte Ergebnis -> concat_ws (',', quoted1, quoted2, ...)

Das ist es!

9
Marty Hirsch

Diese Antwort verwendet Python und eine beliebte Drittanbieter-Bibliothek, PyMySQL . Ich füge es hinzu, weil die csv -Bibliothek von Python mächtig genug ist, um richtig viele verschiedene Arten von .csv verarbeiten zu können, und keine andere Antwort verwendet Python-Code, um mit der Datenbank zu interagieren.

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

Um die vorherigen Antworten zu erweitern, exportiert der folgende Einzeiler eine einzelne Tabelle als durch Tabulatoren getrennte Datei. Es ist für die Automatisierung geeignet, die Datenbank jeden Tag oder so zu exportieren.

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

Praktischerweise können wir dieselbe Technik verwenden, um MySQL-Tabellen aufzulisten und die Felder in einer einzigen Tabelle zu beschreiben:

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

Wenn Sie die Abfrage in der Bash-Befehlszeile ausführen, kann der Befehl tr auch verwendet werden, um die Standard-Tabulatoren durch beliebige Trennzeichen zu ersetzen.

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

7
Brian

Aufbauend auf user7610 ist dies der beste Weg, dies zu tun. Bei mysql outfile gab es 60 Minuten an Dateieigentümer- und Überschreibungsproblemen. 

Es ist nicht cool, aber es hat in 5 Minuten funktioniert.

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

Nicht gerade als CSV-Format, aber tee command von MySQL client kann zum Speichern der Ausgabe in einer local -Datei verwendet werden:

tee foobar.txt
SELECT foo FROM bar;

Sie können es mit notee deaktivieren.

Das Problem mit SELECT … INTO OUTFILE …; ist, dass zum Schreiben von Dateien auf dem Server die Berechtigung erforderlich ist.

5

Folgendes mache ich:

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

Das Perl-Skript (von woanders abgeschnitten) konvertiert die in Tabulatoren angeordneten Felder in CSV.

5
extraplanetary

Mit der von Tim veröffentlichten Lösung habe ich dieses Bash-Skript erstellt, um den Vorgang zu vereinfachen (das Root-Kennwort wird angefordert, Sie können das Skript jedoch leicht ändern, um nach anderen Benutzern zu fragen):

#!/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

Es wird eine Datei mit dem Namen erstellt: database.table.csv

3
lepe

Wenn Sie PHP auf dem Server eingerichtet haben, können Sie mit mysql2csv eine (tatsächlich gültige) CSV-Datei für eine beliebige mysql-Abfrage exportieren. Siehe meine Antwort bei MySQL - SELECT * IN OUTFILE LOCAL? für ein wenig mehr Kontext/Info.

Ich habe versucht, die Optionsnamen von mysql beizubehalten, sodass es ausreichend sein sollte, die Optionen --file und --query anzugeben:

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

"Installieren" mysql2csv über

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

(Laden Sie den Inhalt der Gist herunter, prüfen Sie die Prüfsumme und machen Sie sie ausführbar).

3
Hirnhamster

Versuchen Sie diesen Code:

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

Weitere Informationen: http://dev.mysql.com/doc/refman/5.1/de/select-into.html

1
Indrajeet Singh

Kleines Bash-Skript für einfache Abfragen an CSV-Dumps, inspiriert von https://stackoverflow.com/a/5395421/2841607 .

#!/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

Das folgende Bash-Skript funktioniert für mich. Optional erhält es auch das Schema für die angeforderten Tabellen.

#!/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

Folgendes erzeugt tabulatorgetrennt und gültig CSV-Ausgabe. Im Gegensatz zu den meisten anderen Antworten werden bei dieser Technik Tabulatoren, Kommas, Anführungszeichen und neue Zeilen ohne Stream-Filter wie sed, awk oder tr korrekt ausgeblendet. Das Beispiel zeigt, wie eine entfernte MySQL-Tabelle mithilfe von Streams direkt in eine lokale SQLite-Datenbank geleitet wird. Dies funktioniert ohne die Berechtigung FILE oder SELECT INTO OUTFILE. Ich habe neue Zeilen für die Lesbarkeit hinzugefügt.

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'

Der 2>/dev/null wird benötigt, um die Warnung zum Kennwort in der Befehlszeile zu unterdrücken.

Wenn Ihre Daten NULL haben, können Sie die Funktion IFNULL () in der Abfrage verwenden.

0
humbads

Wenn auf dem von Ihnen verwendeten Rechner PHP installiert ist, können Sie dazu ein Skript PHP schreiben. Für die Installation von PHP ist die MySQL-Erweiterung installiert.

Sie können den PHP -Interpreter von der Befehlszeile aus wie folgt aufrufen:

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

Ich füge den --php-ini-Schalter hinzu, da Sie möglicherweise Ihre eigene PHP -Konfiguration verwenden müssen, die die MySQL-Erweiterung aktiviert. Unter PHP 5.3.0+ ist diese Erweiterung standardmäßig aktiviert, sodass die Konfiguration nicht mehr zur Aktivierung verwendet werden muss.

Dann können Sie Ihr Exportskript wie jedes normale PHP Skript schreiben:

<?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";
    }
?>

Der Vorteil dieser Methode ist, dass es keine Probleme mit varchar und Textfeldern gibt, die Text enthalten, der Zeilenumbrüche enthält. Diese Felder werden korrekt in Anführungszeichen gesetzt und diese Zeilenumbrüche werden vom CSV-Lesegerät als Teil des Textes interpretiert, nicht als Datensatztrennzeichen. Das ist etwas, das mit sed oder so schwer zu korrigieren ist.

0
user7610

Was für mich funktioniert hat:

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

Keine der Lösungen in diesem Thread funktionierte für meinen speziellen Fall. Ich hatte ziemlich viele Json-Daten in einer der Spalten, die in meiner CSV-Ausgabe durcheinander geraten würden. Versuchen Sie für diejenigen mit einem ähnlichen Problem stattdessen Zeilen, die mit\r\n abgeschlossen werden.

Ein weiteres Problem für Benutzer, die versuchen, die CSV-Datei mit Microsoft Excel zu öffnen. Beachten Sie, dass eine einzelne Zelle maximal 32.767 Zeichen enthalten kann. Verwenden Sie die folgende Abfrage, um zu ermitteln, für welche Datensätze in einer Spalte das Problem vorliegt. Sie können diese Datensätze dann abschneiden oder wie gewünscht bearbeiten.

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