You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:09:14