MySQL中如何输出保留转义字符、可直接复制使用的JSON字符串
MySQL JSON类型存储过程输出丢失转义字符问题
问题现象
执行测试存储过程后,输出内容为带实际换行符的结果:
{"test": " "}
该输出语义符合JSON解析规则,但无法直接作为合法JSON字符串复制使用。预期输出为和传入参数完全一致、保留转义字符的格式:{"test": "\n"},复制后可直接作为合法JSON使用,无需额外修改。
注:以下为生产业务代码的极简简化版本,真实场景中输入为多层嵌套、包含大量业务字段的复杂JSON。
DROP PROCEDURE IF EXISTS sys.test_proc; DELIMITER // CREATE PROCEDURE sys.test_proc(IN input JSON) BEGIN SELECT input; END // DELIMITER ; SET @test_input = '{"test": "\n"}'; CALL sys.test_proc(CAST(@test_input AS JSON));
问题原因
MySQL的JSON为结构化存储类型,当字符串被转换为JSON类型时,MySQL会自动解析JSON语义,将转义序列(如\n)转换为对应的实际控制字符(真实换行符)。直接查询JSON类型值时,返回的是解析后的语义化结果,不会保留原始输入中的转义字符写法。
解决方案
方案1(推荐,适配复杂嵌套JSON场景)
全程使用TEXT/LONGTEXT字符串类型传递、存储原始JSON输入,仅在需要提取、修改JSON内部字段时,临时将字符串转换为JSON类型做处理,最终输出直接返回原始字符串,可100%保留输入的转义格式。
修改后的代码如下:
DROP PROCEDURE IF EXISTS sys.test_proc; DELIMITER // CREATE PROCEDURE sys.test_proc(IN input TEXT) BEGIN -- 需操作JSON内部字段时临时转换即可,示例: -- SELECT JSON_EXTRACT(CAST(input AS JSON), '$.test'); SELECT input; END // DELIMITER ; -- 注意:SQL字符串中要表示字面量\,需要写为\\,此处\\n对应JSON中的转义序列\n SET @test_input = '{"test": "\\n"}'; CALL sys.test_proc(@test_input);
方案2(必须使用JSON类型入参时可选)
如果存储过程入参必须定义为JSON类型,可使用JSON_QUOTE()函数将结构化JSON值重新转义为合法JSON字符串格式:
DROP PROCEDURE IF EXISTS sys.test_proc; DELIMITER // CREATE PROCEDURE sys.test_proc(IN input JSON) BEGIN -- JSON_QUOTE返回结果会额外包裹一层双引号,不需要时可结合JSON_UNQUOTE处理 SELECT JSON_QUOTE(input); END // DELIMITER ; SET @test_input = '{"test": "\\n"}'; CALL sys.test_proc(CAST(@test_input AS JSON));
内容的提问来源于stack exchange,提问作者NEO
相关产品推荐
相关产品推荐

