0

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

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 语法来做到这一点还是我必须手动做到这一点?

4

2 回答 2

2

SELECT ... INTO语法中所述:

export_options语句部分的语法由与语句一起使用的相同FIELDSLINES子句组成LOAD DATA INFILE有关and子句的信息,包括它们的默认值和允许值,请参见第 13.2.6 节,“<code>LOAD DATA INFILE 语法”</a> 。FIELDSLINES

该引用页面说:

如果您指定 no FIELDSorLINES子句,则默认值与您编写以下内容相同:

由 '\t' 终止的字段由 '' 封闭由 '\\' 转义
由 '\n' 终止的行由 '' 开始

后来解释说:

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

  • FIELDS ESCAPED BY性格_

  • FIELDS [OPTIONALLY] ENCLOSED BY性格_

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

  • ASCII 0(实际写在转义字符后面的是 ASCII “<code>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 ''
于 2012-08-27T07:53:00.070 回答
0

试试这个查询,比如
SELECT your_fields INTO outfile '/path/file' fields 由 '"' 以 ',' 结尾,以 '\n' FROM table 结尾;
希望这行得通。

于 2012-08-27T05:26:48.097 回答