Yu Guo @ yuguo.im

Export Mysql Table to Excel

Jul 1, 2019

今天有同事问我怎么把Mysql某个表中的数据导出到Excel中?本以为so easy的事,结果踩了很多坑,记录下。

方法一: 使用MySQL Workbench导出CSV

MySQL Workbench 这个客户端软件是我一直使用的一款 MySQL 客户端, 超级强大。自然也少不了导入和导出的功能。具体导出的步骤请移步至官方文档(图文并茂, 美滴很)

在准备享受胜利果实的时候,使用Excel打开导出的CSV文件,我去,中文全都是乱码,怎么办呢?

甭捉急,两步搞定乱码问题:

  1. 使用记事本打开上述的CSV文件
  2. 文件 => 另存为 => 选中编码为ANSI => 最后覆盖原文件,就好了

方法二: 使用原生SQL导出CSV

万变不离其宗,SQL 是一种更加原始粗暴的方案,但是更加实用,即使再花哨的工具,最后归根结底还是会回到这个位置。

语法

SELECT * FROM 表名
INTO OUTFILE '输出的文件位置'
FIELDS TERMINATED BY '字段分隔符(,)'
ENCLOSED BY '字段包围符(")'
LINES TERMINATED BY '行间分隔符(\n)';

理想很丰满,现实很骨感。有了语法,执行时又遇到问题了。

问题一: secure-file-priv选项问题

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

使用的MySQL版本5.7会遇到--secure-file-priv这个选项问题,5.6不会。

  • secure-file-priv 选项值解释
属性值解释
NULL限制mysqld不允许导入或导出
/tmp限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行
不限制mysqld在任意目录的导入导出

通过show global variables like '%secure_file_priv%';查询到我的配置属于限定目录导出,于是导出时指定到那个目录下就好了。

问题二: 没有表头

没有表头,工具类导出做了此项优化,一般不存在这个问题。

/* Add column headers */
SELECT 'A', 'B', 'C'

UNION ALL

/* Now the actual query */
SELECT a, b, c 

FROM `TABLENAME`

/* Save the query results to a file */
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

怎么做到的呢?通过UNION ALL将自定义表头和结果集合并。

反思

永远不要我以为,我以为的就是我以为的吗?


>
CC BY-NC-SA 4.0 2021-PRESENT © Yu Guo