development

MySQL 쿼리 결과를 CSV 형식으로 출력하는 방법은 무엇입니까?

big-blog 2020. 9. 27. 12:59
반응형

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

따옴표로 묶어야하는 열이 많거나 이스케이프해야하는 결과에 따옴표가있는 경우 지저분 해집니다.


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

이 명령을 사용하면 열 이름이 내보내지지 않습니다.

또한 MySQL을 실행 /var/lib/mysql-files/orders.csv하는 서버에 있습니다 . MySQL 프로세스가 실행되는 사용자는 선택한 디렉토리에 쓸 수있는 권한이 있어야합니다. 그렇지 않으면 명령이 실패합니다.

원격 서버 (특히 Heroku 또는 Amazon RDS와 같은 호스팅 또는 가상화 시스템)에서 로컬 시스템에 출력을 쓰려는 경우이 솔루션은 적합하지 않습니다.


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

탭으로 구분됩니다. 진정한 CSV를 얻으려면 다음과 같이 파이프하십시오 (@therefromhere에게 감사드립니다).

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

mysql --batch, -B

탭을 열 구분 기호로 사용하여 각 행을 새 줄에 표시하여 결과를 인쇄합니다. 이 옵션을 사용하면 mysql은 히스토리 파일을 사용하지 않습니다. 배치 모드는 테이블 형식이 아닌 출력 형식을 생성하고 특수 문자를 이스케이프합니다. 이스케이프는 원시 모드를 사용하여 비활성화 할 수 있습니다. --raw 옵션에 대한 설명을 참조하십시오.

이렇게하면 탭으로 구분 된 파일이 제공됩니다. 쉼표 (또는 쉼표를 포함하는 문자열)는 이스케이프되지 않으므로 구분 기호를 쉼표로 변경하는 것은 간단하지 않습니다.


여기에 상당히 형편없는 방법이 있습니다. 어딘가에서 찾았지만 신용을받을 수 없습니다

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 ///는 첫 번째 // 사이를 두 번째 사이의 //로 대체하는 것을 의미합니다.
  • 끝에있는 "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

Unix / Cygwin 전용, 'tr'을 통해 파이프 :

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

주의 : 이것은 포함 된 쉼표 나 포함 된 탭을 처리하지 않습니다.


이것은 저를 몇 번 구했습니다. 빠르고 작동합니다!

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


Paul Tomblin이 제공하는 OUTFILE 솔루션은 MySQL 서버 자체에 파일이 작성되도록하므로 FILE 액세스 권한 이있는 경우에만 작동하며 , 로그인 액세스 또는 해당 상자에서 파일을 검색하는 다른 수단 이있는 경우에만 작동합니다 .

이러한 액세스 권한이없고 탭으로 구분 된 출력이 CSV를 합리적으로 대체하는 경우 (예 : 최종 목표가 Excel로 가져 오는 것이라면) Serbaut의 솔루션 ( mysql --batch및 선택적으로 사용 --raw)이 갈 길입니다.


MySQL Workbench 는 레코드 세트를 CSV로 내보낼 수 있으며 필드의 쉼표를 매우 잘 처리하는 것 같습니다. CSV는 OpenOffice에서 정상적으로 열립니다.


어때 :

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

지금까지 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 서버에 표준으로 제공되는 것보다 더 최신 버전의 루비에 대한 요구 사항에 만족하지 않습니다. 예, 저는 RVM을 사용할 수 있다는 것을 알고 있지만 그렇게 단순한 목적으로 유지하고 싶지는 않습니다.

누군가가 약간의 테스트를 거친 적합한 도구를 지적 할 수 있기를 바랍니다. 그렇지 않으면 내가 찾거나 쓸 때 아마도 이것을 업데이트 할 것입니다.


명령 줄에서 다음을 수행 할 수 있습니다.

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 입력 형식의 코너 케이스를 다룹니다.

스트리밍 방식을 통해 매우 큰 파일을 처리하도록 개선 할 수 있습니다.


  1. 논리 :

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

CSV 테이블을 생성 할 때 서버는 데이터베이스 디렉토리에 테이블 형식 파일을 생성합니다. 파일은 테이블 이름으로 시작하며 확장자는 .frm입니다. 스토리지 엔진은 데이터 파일도 생성합니다. 이름은 테이블 이름으로 시작하며 확장자는 .CSV입니다. 데이터 파일은 일반 텍스트 파일입니다. 테이블에 데이터를 저장하면 스토리지 엔진이 데이터를 쉼표로 구분 된 값 형식으로 데이터 파일에 저장합니다.


이 답변은 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
# 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)

이것은 간단하며 배치 모드 또는 출력 파일이 필요하지 않은 모든 작업에서 작동합니다.

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

그게 다야!


위의 답변 대신 CSV 엔진을 사용하는 MySQL 테이블을 가질 수 있습니다.

그러면 처리하지 않고 복사 할 수있는 CSV 형식의 파일이 하드 디스크에 저장됩니다.


이전 답변을 확장하기 위해 다음 한 줄짜리는 단일 테이블을 탭으로 구분 된 파일로 내 보냅니다. 자동화, 매일 데이터베이스 내보내기에 적합합니다.

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    

또한 Bash 명령 줄에서 쿼리를 수행하는 경우 tr명령을 사용하여 기본 탭을 임의 구분 기호로 대체 할 수 있다고 생각합니다 .

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


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

?>

내가하는 일은 다음과 같습니다.

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로 변환하는 멋진 작업을 수행합니다.


정확히 CSV 형식은 아니지만 MySQL 클라이언트의 tee명령사용하여 출력을 로컬 파일 에 저장할 수 있습니다 .

tee foobar.txt
SELECT foo FROM bar;

을 사용하여 비활성화 할 수 있습니다 notee.

문제 SELECT … INTO OUTFILE …;는 서버에서 파일 쓰기 권한이 필요하다는 것입니다.


Tim이 게시 한 솔루션을 사용하여 프로세스를 용이하게하기 위해이 bash 스크립트를 만들었습니다 (루트 암호가 요청되지만 스크립트를 쉽게 수정하여 다른 사용자를 요청할 수 있음).

#!/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 인 파일이 생성 됩니다.


서버에 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

(요점의 내용을 다운로드하고 체크섬을 확인하고 실행 가능하게 만드십시오).


나를 위해 일한 것 :

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

이 스레드의 솔루션 중 어느 것도 내 특정 경우에 효과가 없었으며 열 중 하나에 예쁜 json 데이터가 있었기 때문에 내 csv 출력에서 ​​엉망이 될 것입니다. 비슷한 문제가있는 경우 대신 \ r \ n으로 끝나는 줄을 시도하십시오.

또한 Microsoft Excel로 csv를 열려고하는 사람들에게 또 다른 문제는 단일 셀에 저장할 수있는 32,767 자의 제한이 있으며 그 이상은 아래 행으로 오버플로된다는 점입니다. 열에서 문제가있는 레코드를 식별하려면 아래 쿼리를 사용하십시오. 그런 다음 해당 레코드를 자르거나 원하는대로 처리 할 수 ​​있습니다.

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

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"

다음 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

사용중인 컴퓨터에 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 로 수정하기 어려운 것입니다 .


이 코드를 시도하십시오.

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


다음은 탭으로 구분 된 유효한 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 () 함수를 사용할 수 있습니다.


SQL 편집기 / 터미널에서 아래 명령을 사용할 수 있습니다.

" mysql -h (호스트 이름 / IP>) -u (사용자 이름) -p (암호) 데이터베이스 이름 <(query.sql)> outputFILE (.txt / .xls) "

예 : 호스트 이름 -xxxx

uname-사용자 이름

암호-암호

DBName-employeeDB

queryFile-employee.sql

outputFile-outputFile.xls

mysql -hx.xxx -uusername -ppassword employeeDB <employee.sql> outputFile.xls

SQL 쿼리가있는 디렉토리에서 명령을 실행하고 있는지 확인하거나 위 명령에서 SQL 쿼리 위치의 전체 경로를 언급하십시오.

참고 URL : https://stackoverflow.com/questions/356578/how-to-output-mysql-query-results-in-csv-format

반응형