我想使用此查询将一些字段输出到文件中:
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语法执行此操作,还是必须手动执行此操作?
答案 0 :(得分:2)
该语句的
export_options
部分的语法包含与之一起使用的FIELDS
和LINES
子句LOAD DATA INFILE
声明。有关FIELDS
和LINES
子句的相关信息,请参阅Section 13.2.6, “LOAD DATA INFILE
Syntax”,包括其默认值和允许值。
参考页面说:
如果您没有指定
FIELDS
或LINES
子句,则默认值与您编写的相同: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 BY
和LINES 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;
希望这有效..