将 MySQL 导出为 CSV,一些列带引号,一些不带引号

Posted

技术标签:

【中文标题】将 MySQL 导出为 CSV,一些列带引号,一些不带引号【英文标题】:Export MySQL to CSV, some columns with quotes and some without 【发布时间】:2016-05-16 02:56:26 【问题描述】:

我正在导出一个 mysql 表,我想导出不带双引号的整数类型列,但导出带双引号的 varchar 类型列。我需要这样做才能为我的下一步工作设置正确的格式。这可以在 MySQL 中完成吗?我知道我可能可以在 python 脚本中执行此操作,但 csv 文件非常大(> 1 GB),因此我认为可能需要一段时间才能执行此操作。无论如何,这可以使用 MySQL 查询吗?

这是我当前的导出脚本格式:

SELECT 
   'column_name_1',
   'column_name_2',
   ...
   'column_name_n'
UNION ALL
SELECT *
FROM table
INTO OUTFILE 'table.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

如果有帮助,这里是我要导出的表格(更重要的是,所涉及的类型):

+-------------------------+------------------+------+-----+---------+-------+
| Field                   | Type             | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+---------+-------+
| field_1                 | int(10) unsigned | NO   | MUL | 0       |       |
| field_2                 | int(10) unsigned | NO   | MUL | NULL    |       |
| field_3                 | int(10) unsigned | NO   |     | NULL    |       |
| field_4                 | char(1)          | NO   |     | NULL    |       |
| field_5                 | int(10) unsigned | NO   |     | NULL    |       |
| field_6                 | varchar(4)       | NO   |     |         |       |
| field_7                 | char(1)          | NO   |     | Y       |       |
| field_8                 | varchar(20)      | NO   |     |         |       |
| field_9                 | varchar(200)     | NO   |     |         |       |
+-------------------------+------------------+------+-----+---------+-------+

编辑1:我按照答案中的建议尝试了OPTIONALLY ENCLOSED BY '"',但是当我将其添加到脚本中时,它会为每一列加上双引号,而不仅仅是字符串(或varchar)列。知道它为什么会这样做吗?

【问题讨论】:

“它对每一列进行双引号,而不仅仅是字符串(或 varchar)列。知道它为什么会这样做吗?” – 为什么不呢?只引用 all 字段值是完全可以的,无论它们包含什么,并且最后有一个“有效”的 CSV 文件。你为什么要关心整数值是否有引号? @CBroe 我需要这样做才能为我的下一步工作设置正确的格式。 @CBroe 显然他没有在下一步使用通用 CSV 解析器 对,我将这些 csv 文件导入其中的软件不会将带有双引号的列识别为整数。 我需要这个,因为我的输出将是一个 bash 脚本。 【参考方案1】:

使用OPTIONALLY ENCLOSED BY 子句。

SELECT *
FROM table
INTO OUTFILE 'table.csv'
FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

OPTIONALLY 修饰符使它只对字符串列执行此操作。

您还需要省略返回标题行的子查询。问题是联合的所有行都需要在列中具有相同的类型,因此它将所有非字符串转换为字符串以匹配标题行。

【讨论】:

当我使用 OPTIONALLY ENCLOSED BY '"' 时,它会用引号括住每一列? 我自己试过了,整数列没有被引用。也许它依赖于 sql 模式或其他一些设置? 什么版本的 MySQL?我正在使用 5.5.43。 我看到了问题。返回列名的第一个 SELECT 会导致所有列都被视为字符串。 它将第二个子查询的结果转换为字符串,因为UNION 的所有行都必须具有相同的数据类型。

以上是关于将 MySQL 导出为 CSV,一些列带引号,一些不带引号的主要内容,如果未能解决你的问题,请参考以下文章

使用html代码将mysql表导出到csv

如何将 SQL Server 2005 查询导出到 CSV

如何:在 MySQL 工作台中将记录集导出为分号分隔的 csv 文件?

使用 SSIS OR T-SQL 将一列带引号和不带引号的逗号分隔值拆分为多列

将 JSON 数据从 MySQL 表导出到 CSV

从 Access 导出不带双引号的 CSV 文件