Jak wypisać wyniki zapytań MySQL w formacie CSV?

Czy istnieje łatwy sposób na uruchomienie zapytania MySQL z linii poleceń Linuksa i wypisanie wyników w formacie CSV ?

Oto co teraz robię:

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

Robi się bałagan, gdy istnieje wiele kolumn, które muszą być otoczone cudzysłowami, lub jeśli w wynikach są cytaty, które muszą być zabezpieczone.

Author: codeforester, 2008-12-10

28 answers

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

Użycie tego polecenia nazwy kolumn nie będą eksportowane.

Zauważ również, że /var/lib/mysql-files/orders.csv będzie na serwerze, na którym działa MySQL. Użytkownik, pod którym działa proces MySQL, musi mieć uprawnienia do zapisu do wybranego katalogu, w przeciwnym razie polecenie nie powiedzie się.

Jeśli chcesz zapisać wyjście do komputera lokalnego ze zdalnego serwera (szczególnie hostowane lub wirtualizowane maszyny, takie jak Heroku lub Amazon RDS), To rozwiązanie nie jest odpowiednie.

 1470
Author: Paul Tomblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-12 19:34:45
$ mysql your_database --password=foo < my_requests.sql > out.csv

Który jest oddzielony tabulatorami. Rura to tak, aby uzyskać prawdziwy CSV (dzięki @ therefromhere):

... .sql | sed 's/\t/,/g' > out.csv
 370
Author: Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 17:05:59

Mysql --batch, - B

Wyświetla wyniki za pomocą tab jako separatora kolumn, z każdym wierszem na nowa linia. Dzięki tej opcji mysql nie używa pliku historii. Tryb wsadowy powoduje, że format wyjściowy nie jest tabelaryczny i znaki specjalne. Ucieczka może być wyłączona za pomocą trybu raw; zobacz opis opcji --raw.

To da Ci plik oddzielony tabulatorami. Ponieważ przecinki (lub łańcuchy zawierające przecinki) nie są unikalne, nie jest łatwo zmienić ogranicznik na przecinek.

 174
Author: serbaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-30 10:51:27

Jest to dość paskudny sposób na zrobienie tego. Znalazłem to gdzieś, nie mogę wziąć żadnego kredytu

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

Działa całkiem nieźle. Po raz kolejny, choć regex udowadnia tylko zapis.

Wyjaśnienie Regex:

  • S / / / oznacza zastąpienie tego, co jest między pierwszym / / tym, co jest między drugim / /
  • "g" na końcu jest modyfikatorem, który oznacza "wszystkie instancje, nie tylko pierwsze"
  • ^ (w tym kontekście) oznacza początek linii
  • $ (w tym kontekście) oznacza koniec linii

Więc, składając to wszystko razem:

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
 117
Author: Tim Harding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 17:13:53

Unix/Cygwin tylko, przepuść go przez 'tr':

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

Uwaga: nie obsługuje ani osadzonych przecinków, ani osadzonych tabulatorów.

 75
Author: strickli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 12:09:47

Rozwiązanie OUTFILE podane przez Paula Tomblina powoduje, że plik zostanie zapisany na samym serwerze MySQL, więc będzie to działać tylko wtedy, gdy masz dostęp do pliku , a także dostęp do loginu lub inne sposoby pobierania pliku z tego pola.

Jeśli nie masz takiego dostępu, a rozdzielane tabulatorami wyjście jest rozsądnym substytutem pliku CSV( np. jeśli twoim celem końcowym jest import do Excela), rozwiązanie Serbauta (za pomocą mysql --batch i opcjonalnie --raw) jest dobrym rozwiązaniem.

 34
Author: Leland Woodbury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-22 13:48:00

To uratowało mnie kilka razy. Szybko i działa!

--Nr serii

--raw

Przykład:

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
 33
Author: hrvoj3e,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 13:59:38

A może:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv
 31
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 11:36:53

MySQL Workbench potrafi eksportować zestawy rekordów do pliku CSV i zdaje się bardzo dobrze obsługiwać przecinki w polach. Plik CSV otwiera się w OpenOffice.

 30
Author: David Oliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 15:10:56

Wszystkie dotychczasowe rozwiązania, z wyjątkiem Mysql workbench, są nieprawidłowe i prawdopodobnie niebezpieczne (czyli problemy z bezpieczeństwem) dla przynajmniej niektórych możliwych treści w mysql db.

Mysql Workbench (i podobnie PHPMyAdmin) zapewniają formalnie poprawne rozwiązanie, ale są przeznaczone do pobierania danych wyjściowych do lokalizacji użytkownika. Nie są tak przydatne do takich rzeczy jak automatyzacja eksportu danych.

Nie jest możliwe wygenerowanie wiarygodnie poprawnego pliku csv z wyjścia mysql -B -e 'SELECT ...' ponieważ nie może to zakodować zwrotów karetki i białych spacji w polach. Znacznik '- s' dla mysql nie powoduje ucieczki ukośnika wstecznego i może prowadzić do poprawnego rozwiązania. Jednak używanie języka skryptowego (takiego z przyzwoitymi wewnętrznymi strukturami danych, a nie bash) i bibliotek, w których problemy z kodowaniem zostały już starannie opracowane, jest o wiele bezpieczniejsze.

Myślałem o napisaniu scenariusza do tego, ale jak tylko pomyślałem o tym, jak to nazwę, przyszło mi do głowy, aby szukać wcześniej istniejące dzieło o tej samej nazwie. Chociaż nie przejrzałem tego dokładnie, rozwiązanie na https://github.com/robmiller/mysql2csv wygląda obiecująco. W zależności od aplikacji, podejście yaml do określania poleceń SQL może, ale nie może się podobać. Nie jestem również zachwycony wymogiem na nowszą wersję ruby niż jest Standardowo z moim laptopem Ubuntu 12.04 lub serwerami Squeeze Debiana. Tak Wiem, że mógłbym użyć RVM, ale wolałbym nie utrzymywać tego dla taki prosty cel.

Mam nadzieję, że ktoś wskaże odpowiednie narzędzie, które zostało trochę Przetestowane. W przeciwnym razie prawdopodobnie zaktualizuję to, gdy znajdę lub napiszę.

 24
Author: mc0e,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-11 05:04:34

Z linii poleceń, możesz to zrobić:

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*

Podziękowania: eksport tabeli z Amazon RDS do pliku csv

 21
Author: Sri Murthy Upadhyayula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:20
  1. logika:

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

Podczas tworzenia tabeli CSV serwer tworzy plik w formacie tabeli w katalog bazy danych. Plik zaczyna się od nazwy tabeli i ma .rozszerzenie frm. Silnik pamięci masowej tworzy również plik danych. Jego nazwa zaczyna się od nazwy tabeli i ma .Rozszerzenie CSV. Plik danych jest zwykły plik tekstowy. Podczas przechowywania danych w tabeli, magazyn silnik zapisuje go do pliku danych w wartościach oddzielonych przecinkami format.

 12
Author: zloctb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-07 08:41:04

Wiele odpowiedzi na tej stronie jest słabych, ponieważ nie obsługują ogólnego przypadku tego, co może wystąpić w formacie CSV. np. przecinki i cudzysłowy osadzone w polach i innych warunkach, które zawsze pojawiają się w końcu. Potrzebujemy ogólnego rozwiązania, które będzie działać dla wszystkich ważnych danych wejściowych CSV.

Oto proste i mocne rozwiązanie w Pythonie:

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

Nazwij ten plik tab2csv, umieść go na swojej ścieżce, nadaj mu uprawnienia wykonawcze, a następnie użyj listy:

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

Pyton Funkcje obsługi CSV obejmują narożniki dla formatów wejściowych CSV.

Można to poprawić, aby obsługiwać bardzo duże pliki za pomocą podejścia strumieniowego.

 12
Author: Chris Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-01 05:52:26

Aby rozwinąć poprzednie odpowiedzi, poniższy one-liner eksportuje pojedynczą tabelę jako plik oddzielony tabulatorami. Nadaje się do automatyzacji, eksportowania bazy danych każdego dnia.

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

Wygodnie, możemy użyć tej samej techniki do wypisania tabel MySQL i opisania pól w jednej tabeli:

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    
 9
Author: johntellsall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-23 16:09:02

Jest to proste i działa na wszystkim bez potrzeby trybu wsadowego lub plików wyjściowych:

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

from your_table where etc;

Wyjaśnienie:

  1. Zastąp " z "" w każdym polu -- > replace(field1, '"', '""')
  2. otocz każdy wynik cudzysłowem --> concat ( '" ', result1,'"')
  3. Umieść przecinek pomiędzy każdym cytowanym wynikiem --> concat_ws ( ' ,', quoted1, quoted2, ...)
To jest to!
 9
Author: Marty Hirsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 12:05:59

Również, jeśli wykonujesz zapytanie w wierszu poleceń Bash, wierzę, że polecenie tr może być użyte do zastąpienia domyślnych tabulatorów dowolnymi ogranicznikami.

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

 9
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-01 11:59:28

Alternatywnie do odpowiedzi powyżej, możesz mieć tabelę MySQL, która korzysta z silnika CSV.

Wtedy będziesz miał plik na dysku twardym, który zawsze będzie w formacie CSV, który możesz po prostu skopiować bez przetwarzania go.

 8
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 23:34:58

Oto co robię:

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

Skrypt Perla (wycinany z innego miejsca) wykonuje niezłą robotę konwertując pola z tabulatorami do pliku CSV.

 5
Author: extraplanetary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 01:01:32

Nie do końca jako format CSV, ale tee polecenie z MySQL client może być użyte do zapisania wyjścia dolokalnego pliku :

tee foobar.txt
SELECT foo FROM bar;

Możesz go wyłączyć używając notee.

Problem z SELECT … INTO OUTFILE …; polega na tym, że wymaga uprawnień do zapisu plików na serwerze.

 5
Author: Denilson Sá Maia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-29 18:14:01

Bazując na user7610, oto najlepszy sposób, aby to zrobić. W przypadku {[1] } było 60 minut problemów z własnością i nadpisywaniem plików.

Nie jest fajne, ale zadziałało w 5 min.

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

?>
 5
Author: Michael Cole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-29 18:36:18

Ta odpowiedź używa Pythona i popularnej biblioteki stron trzecich, PyMySQL . Dodaję go, ponieważ Biblioteka csv Pythona jest wystarczająco potężna, aby poprawnie obsługiwać wiele różnych smaków .csv i żadne inne odpowiedzi nie używają kodu Pythona do interakcji z bazą danych.

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 isn't much better, but this is an example
# http://stackoverflow.com/questions/12461484/is-it-secure-to-store-passwords-as-environment-variables-rather-than-as-plain-t
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)
 5
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 23:02:33

Korzystając z rozwiązania opublikowanego przez Tima, stworzyłem skrypt bash, aby ułatwić ten proces (wymagane jest hasło roota, ale możesz łatwo zmodyfikować skrypt, aby poprosić o innego użytkownika):

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

Utworzy plik o nazwie: baza danych.stolik.csv

 3
Author: lepe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 08:04:06

Wypróbuj ten kod:

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

Więcej informacji: http://dev.mysql.com/doc/refman/5.1/en/select-into.html

 3
Author: Indrajeet Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 07:39:58

Jeśli masz skonfigurowany PHP na serwerze, możesz użyć mysql2csv, aby wyeksportować (właściwie poprawny) plik CSV dla abitrycznego zapytania mysql. Zobacz moja odpowiedź w MySQL-wybierz * w OUTFILE LOCAL ? dla trochę więcej kontekstu / informacji.

Starałem się zachować nazwy opcji z mysql więc powinno wystarczyć podanie opcji --file i --query:

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

"Install" 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

(pobierz zawartość gist, sprawdź sumę kontrolną i zrób to wykonywalny).

 2
Author: Hirnhamster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-16 11:31:57

Jeśli NA używanym komputerze jest zainstalowany PHP, możesz napisać skrypt PHP, aby to zrobić. Wymaga instalacji PHP z zainstalowanym rozszerzeniem MySQL.

Możesz wywołać interpreter PHP z linii poleceń w następujący sposób:

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

Włączam przełącznik --php-ini, ponieważ może być konieczne użycie własnej konfiguracji PHP, która umożliwia rozszerzenie MySQL. W PHP 5.3.0 + to rozszerzenie jest domyślnie włączone, więc nie jest już konieczne używanie konfiguracji do włącz to.

Następnie możesz napisać swój skrypt eksportu jak każdy normalny skrypt 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";
    }
?>

Zaletą tej metody jest to, że nie ma ona problemów z polami varchar i text, które mają tekst zawierający znaki nowej linii. Pola te są poprawnie cytowane, a nowe wiersze w nich zawarte będą interpretowane przez czytnik CSV jako część tekstu, a nie separatory rekordów. To jest coś, co jest trudne do skorygowania później sed lub tak.

 1
Author: user7610,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 12:09:04

Mały skrypt bash do wykonywania prostych zapytań do zrzutów CSV, zainspirowany 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
Author: minitauros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 12:23:23

Następujący skrypt bash działa dla mnie. Opcjonalnie pobiera również schemat dla żądanych tabel.

#!/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
Author: Wolfgang Fahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-14 15:19:27

Możesz użyć poniższego polecenia ze swojej lokalizacji SQL:

"mysql-H (hostname / IP>) - u (username) - p(password) databasename outputFILE(.txt/xls)"

E. g Nazwa hosta-x.x.x.X

Uname-username

Password-Hasło

DBName-employeeDB

QueryFile-pracownik.sql

OutputFile-outputFile.xls

Mysql-hx.x.X. X-uusername-ppassword employeeDB outputFile.xls

Make na pewno wykonujesz polecenie z katalogu, w którym znajduje się SQL, lub wspomnij pełną ścieżkę lokalizacji sql w powyższym poleceniu.

 0
Author: Ripudaman Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-24 12:48:25