【问题标题】:Extra backslash \ when SELECT ... INTO OUTFILE ... in MySQL额外的反斜杠 \ 当 SELECT ... INTO OUTFILE ... 在 MySQL
【发布时间】:2011-03-11 01:43:45
【问题描述】:

所以我正在尝试将 MySQL 表导出为 CSV。我正在使用这个查询:

SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n";

输出是这样的:

http://postimage.org/image/2ghyenh5w/full/

这样做的问题是总是有一个额外的反斜杠 \ 那里有换行符,例如在地址字段中。

但是,从 phpMyAdmin 导出的 CSV 没有它:

http://postimage.org/image/2gi026tno/full/

有什么方法可以让 SELECT ... OUTFILE ... 做同样的事情吗?

我正在处理的表有 2000 万条记录,phpMyAdmin 对于每个导出操作只能处理大约 500,000 条记录 - 否则它将变为空白或 mysql 服务器消失等。

【问题讨论】:

  • +1 我一直使用 PHP 生成我的 CSV,所以这看起来容易多了。
  • @alex,我可以看看你的 sn-p 吗? ;) 什么是逃逸?如果内容中有 " 和 , 怎么办?如何处理 UTF8 字符?

标签: mysql sql into-outfile


【解决方案1】:

MySQL 导出似乎无法正确导出换行符和引号。

导出时,MySQL 会自动转义两者

  • 字段分隔符和
  • 行分隔符

默认情况下,转义字符是反斜杠。您可以通过在查询中添加 ESCAPED BY '' 来覆盖它。

不幸的是,在“普通”(Excel 兼容)CSV 文件中,您可能需要对换行符和引号使用不同的编码。具体来说,您希望换行符不转义,引号加倍。

例如如果一个值包含这样的换行符:

这是第 1 行
这是“第 2 行”,其中包含引号

应该变成

“这是第 1 行
这是""Line 2"",其中包含引号"

我找到的解决方案是预先转义引号,并将ESCAPED BY ''(一个空字符串)添加到我的查询中。

SELECT REPLACE(field1, '"', '""'),  
       REPLACE(field2, '"', '""'),  
       ...  
FROM ...  
WHERE ...  
INTO OUTFILE '/someFile.csv'  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY ''  
LINES TERMINATED BY '\n'

【讨论】:

  • +1 我在这个问题上花了很长时间。为什么 MySQL 不能在没有无数选项和 hack 的情况下仅导出为“标准”CSV,这对我来说是个谜。
【解决方案2】:

试试这个:

SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
fields terminated by ',' OPTIONALLY ENCLOSED BY '"' escaped by '"' 
LINES TERMINATED BY '\n';

我认为问题在于 MySQL 试图在您的文本字段中转义换行符 ('\n'),因为它是您的行终止符。

FIELDS ESCAPED BY 控制如何写入特殊字符。如果 FIELDS ESCAPED BY 字符不为空,则将其用作输出中以下字符之前的前缀:

字符转义的字段

字段[可选地]被字符包围

FIELDS TERMINATED BY 和 LINES TERMINATED BY 值的第一个字符

ASCII NUL(零值字节;实际写在转义字符后面的是 ASCII “0”,而不是零值字节)

(MySQL)

我真的不明白为什么它会在你的情况下做它正在做的事情,但我能够在我的 Mac 上得到类似的东西,上面的查询似乎修复了我的情况下的输出。

希望有帮助!

【讨论】:

  • 如果您使用单引号将查询括起来并在内部使用双引号,请使用fields terminated by "," OPTIONALLY ENCLOSED BY "\"" escaped by "\"" LINES TERMINATED BY "\n"
【解决方案3】:

我遇到了同样的问题,我发现(在将 csv 文件导入电子表格后)MySQL 表中的某些 varchar 字段中存在换行符。删除换行符后,导出工作正常。

【讨论】:

    【解决方案4】:

    试试这个:

    SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
    FIELDS TERMINATED BY  ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\' 
    LINES TERMINATED BY '\n';
    

    我意识到使用escaped by '\' 可以删除导出结果中的反斜杠。

    【讨论】:

      【解决方案5】:

      这里有答案https://bugs.mysql.com/bug.php?id=46434

      要点是:
      1. INTO OUTFILE 旨在生成可供 LOAD DATA 加载的结果
      2.默认ESCAPED BY是'\'
      3. 要禁用转义,请使用 ESCAPED BY ''

      【讨论】:

        【解决方案6】:

        我通过将\r\n 指定为行终止符而不是\n 解决了这个问题:

        SELECT * FROM business WHERE id > 0 AND id <= 20000
        INTO OUTFILE "business.csv"
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '"'
        ESCAPED BY '\'
        LINES TERMINATED BY '\r\n';
        

        现在每一行都由\r\n 分隔,但数据中的任何换行符都不会转义——假设其中存在的行分隔符都是\n,而不是\r\n

        令人惊讶的是,这在 Linux 上运行良好,就我的目的而言——使用 League\Csv (PHP) 导入。我猜想导入生成的 CSV 的任何软件都必须足够聪明,才能区分 \n\r\n 的换行符。

        【讨论】:

          【解决方案7】:
          SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"fields terminated by ',' 
          OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES TERMINATED BY '\n';
          

          首先,不要把'""作为转义符,这会改变你的内容。

          其次,如果您在 cli 上使用此查询,如下所示,您还需要远程添加一个额外的 '\n' 多行添加行。

          mysql -e "SELECT * FROM business WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
          fields terminated by ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' 
          LINES TERMINATED BY '\n';"
          

          【讨论】:

            【解决方案8】:

            我遇到了类似的问题。

            1. 为了防止\ 在字段值中有换行符时出现额外的反冲,我添加了ESCAPED BY '\'
            2. 为了防止 MySQL 终止字段值中存在换行符的字段,我将换行符 \n 替换为空格 ' '
            SELECT
                REPLACE(field1, '\n', ' '),
                REPLACE(field2, '\n', ' '),
                REPLACE(fieldN, '\n', ' ')
            FROM business
            WHERE id > 0 AND id <= 20000 INTO OUTFILE "business.csv"
            FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\' LINES TERMINATED BY '\n';
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-02-21
              • 2012-02-26
              • 1970-01-01
              • 2010-11-05
              • 2013-03-24
              • 1970-01-01
              • 2011-02-17
              相关资源
              最近更新 更多