[mysql] 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-배치, -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)이 사용 됩니다.