MySQL:如何在outfile中转义反斜杠?

时间:2012-08-27 05:18:27

标签: mysql special-characters

我想使用此查询将一些字段输出到文件中:

SELECT
    CONCAT('[',
        GROUP_CONCAT(
            CONCAT(CHAR(13), CHAR(9), '{"name":"', name, '",'),
            CONCAT('"id":', CAST(rid AS UNSIGNED), '}')
        ),
    CHAR(13), ']')
AS json FROM `role`
INTO OUTFILE '/tmp/roles.json'

在输出文件中我得到这样的东西:

[
\       {"name":"anonymous user","rid":1},
\       {"name":"authenticated user","rid":2},
\       {"name":"admin","rid":3},
\       {"name":"moderator","rid":4}
]

如您所见,换行符(char(13))没有反斜杠,但是制表符(char(9))有。我该怎样摆脱它们?

更新 Sundar G给了我一个提示,所以我将查询修改为:

SELECT
    CONCAT('"name":', name),
    CONCAT('"rid":', rid)

INTO outfile '/tmp/roles.json'

FIELDS TERMINATED BY ','
LINES STARTING BY '\t{' TERMINATED BY '},\n'

FROM `role`

我不知道为什么,但是这种语法会从输出文件中删除反斜杠:

       {"name":"anonymous user","rid":1},
       {"name":"authenticated user","rid":2},
       {"name":"admin","rid":3},
       {"name":"moderator","rid":4}

这已经是非常好的输出,但我还想在文件的开头和结尾添加开始和结束方括号。我可以通过MySQL语法执行此操作,还是必须手动执行此操作?

2 个答案:

答案 0 :(得分:2)

SELECT ... INTO Syntax中所述:

  

该语句的 export_options 部分的语法包含与之一起使用的FIELDSLINES子句LOAD DATA INFILE声明。有关FIELDSLINES子句的相关信息,请参阅Section 13.2.6, “LOAD DATA INFILE Syntax”,包括其默认值和允许值。

参考页面说:

  

如果您没有指定FIELDSLINES子句,则默认值与您编写的相同:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''

后来解释说:

  

对于输出,如果FIELDS ESCAPED BY字符不为空,则用于在输出中为后面的字符添加前缀:

     
      
  • FIELDS ESCAPED BY字符

  •   
  • FIELDS [OPTIONALLY] ENCLOSED BY字符

  •   
  • FIELDS TERMINATED BYLINES TERMINATED BY值的第一个字符

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

  •   
     

如果FIELDS ESCAPED BY字符为空,则不转义字符,NULL输出为NULL,而不是\N。指定一个空的转义字符可能不是一个好主意,特别是如果数据中的字段值包含刚刚给出的列表中的任何字符。

因此,由于您没有明确指定FIELDS子句,因此字段中任何出现的默认TERMINATED BY字符(即选项卡)都将被默认的ESCAPED BY字符转义(即反斜杠):所以你创建的制表符会被转义。为避免这种情况,请明确指定不同的字段终止字符或使用空字符串作为转义字符。

但是,您还应注意,结果的大小将受group_concat_max_len的限制。也许更好的选择是:

SELECT json FROM (
  SELECT 1 AS sort_col, '[' AS json
UNION ALL
  SELECT 2, CONCAT('\t{"name":', QUOTE(name), ',"id":', CAST(rid AS UNSIGNED), '}')
  FROM   role
UNION ALL
  SELECT 3, ']'
) t
ORDER BY sort_col
INTO OUTFILE '/tmp/roles.json' FIELDS ESCAPED BY ''

答案 1 :(得分:0)

尝试像这样的查询 选择your_fields INTO outfile'/ path / file'字段括在'''以'结尾','以'\ n'结尾的行 FROM table;
希望这有效..