我有一个存储过程(请参阅下面的stored_procedure_1代码),它期望将json作为参数传递并将该数据插入到表中。
-- 存储过程_1:
DELIMITER \\
DROP PROCEDURE IF EXISTS my_test_procedure \\
CREATE PROCEDURE my_test_procedure(my_payload JSON)
BEGIN
INSERT INTO my_test_table (id, ud)
SELECT jt.id,
jt.ud
FROM JSON_TABLE(my_payload, '$[*]' columns (
id int path '$.id',
ud json path '$.ud'
)) AS jt;
END \\
DELIMITER ;
-- 表 DDL:
CREATE TABLE my_test_table
(
id int,
ud varchar(255),
PRIMARY KEY (id)
);
使用以下调用(请参阅下面的 call_1)调用该过程,该调用将 json 字符串作为其中一个元素的值会给出错误(请参阅下面的 error_1 响应)。
-- call_1:
CALL my_test_procedure('[{"id":1,"ud":"{\"1\":5,\"2\":6,\"3\":7}"}]');
-- 错误_1: 错误代码:3140。无效的 JSON 文本:“对象成员后缺少逗号或 '}'。”位于“.my_payload”列值的第 17 位。
使用该值作为 json 进行调用(请参阅下面的 call_2)按预期工作。
-- call_2:
CALL my_test_procedure('[{"id":1,"ud":{\"1\":5,\"2\":6,\"3\":7}}]'); -- OR
CALL my_test_procedure('[{"id":1,"ud":{"1":5,"2":6,"3":7}}]');
在 MySQL 代码中寻找解决方法的建议(考虑传递的有效负载的格式无法更改)。
问题在于字符串中
"
的转义;当MySQL解释该字符串时,\"
被解释为"
。例如:
SELECT '[{"id":1,"ud":"{\"1\":5,\"2\":6,\"3\":7}"}]'
输出:
[{"id":1,"ud":"{"1":5,"2":6,"3":7}"}]
这不是有效的 JSON。为了在 MySQL 解释时成为有效的 JSON,您需要在
\
:之前转义
"
SELECT '[{"id":1,"ud":"{\\"1\\":5,\\"2\\":6,\\"3\\":7}"}]'
输出:
[{"id":1,"ud":"{\"1\":5,\"2\":6,\"3\":7}"}]
这将适用于您的程序:
CALL my_test_procedure('[{"id":1,"ud":"{\\"1\\":5,\\"2\\":6,\\"3\\":7}"}]');
SELECT *
FROM my_test_table
输出:
id ud
1 "{\"1\":5,\"2\":6,\"3\":7}"