MySQL插入转义双引号被自动删除,无法正常存储JSON如何解决
问题根本原因
你遇到的转义符丢失是两层转义规则叠加导致的:
- 第一层是MySQL的字符串字面量解析规则,会先吃掉一层反斜杠转义
- 第二层是JSON本身的字符串转义规则,要求字符串内的双引号必须加反斜杠转义
你原来写的\"只会被MySQL的字符串解析层识别为普通双引号,透传给JSON引擎时已经没有反斜杠,自然会导致JSON语法错误。
解决方案
方案1:手动加两层转义
如果要手动写SQL拼接JSON字符串,需要给需要转义的双引号加两层反斜杠,也就是把\"替换为\\",示例如下:
INSERT into JSON_VALUES SET ID = 150, RESULT = '[{"ID":"150","VALUE":"THIS IS A \\"TEST\\" THAT IS IGNORED","DATE":"2021-08-26"}]'
此时MySQL解析字符串时会把\\"转换为\",正好符合JSON的转义要求。
方案2:使用MySQL内置JSON函数构造内容(最推荐)
不需要手动处理任何转义,直接用JSON_ARRAY、JSON_OBJECT函数构造JSON结构,MySQL会自动处理所有转义逻辑,示例如下:
INSERT into JSON_VALUES SET ID = 150, RESULT = JSON_ARRAY( JSON_OBJECT( 'ID', '150', 'VALUE', 'THIS IS A "TEST" THAT IS IGNORED', 'DATE', '2021-08-26' ) );
这个方案完全避免了手动写转义符的出错概率,也不需要记忆多层转义规则。
方案3:代码操作时使用参数化查询
如果你是通过业务代码操作数据库,不要手动拼接SQL字符串,一律使用对应语言的参数化查询功能,数据库驱动会自动处理所有转义逻辑,不会出现转义符丢失的问题。
验证方式
插入完成后可以用JSON_VALID函数校验存储的JSON是否合法:
SELECT JSON_VALID(RESULT) FROM JSON_VALUES WHERE ID = 150;
返回1说明JSON格式合法,可正常读取解析。
内容的提问来源于stack exchange,提问作者Eduardo Ponce de Leon
相关产品推荐
相关产品推荐

