MariaDB中json_value提取含转义字符的JSON值异常如何解决
问题原因
你遇到的值截断、后续字段返回null的问题,本质是SQL字符串层面的转义缺失,和json_value函数本身无关:
- MariaDB里用单引号包裹的字符串字面量中,反斜杠
\是SQL语法层面的转义符,你写的\"会被SQL解析器直接处理成普通双引号,最终存入@json变量的内容实际是{"Item_Name":"60" Table", "Item_ID":"1"} - 上述内容是非法JSON:
60后面的双引号没有被转义,JSON解析器会判定Item_Name的值到60就已经结束,后续的Table"属于语法错误,整个JSON解析在该位置中断,后面的Item_ID字段自然无法读取,返回null。
排查这类问题时可以先执行select JSON_VALID(@json)校验,传入非法JSON时该函数会返回0。
解决方案
方案1:正确做双层转义
JSON语法中,字符串内部的双引号需要用\"转义;对应到SQL的单引号字符串中,反斜杠本身需要再转义一次,也就是把JSON里的\"写成\\"即可:
Set @json = '{"Item_Name":"60\\" Table", "Item_ID":"1"}'; select json_value(@json,'$.Item_Name') as Item_Name , json_value(@json,'$.Item_ID') as ID
执行后返回结果符合预期:
- Item_Name字段返回
60" Table - Item_ID字段返回
1
方案2:用JSON构造函数避免手写转义(推荐)
如果JSON内容比较复杂,手动处理多层转义很容易出错,可以直接用JSON_OBJECT函数构造合法JSON,函数会自动处理所有特殊字符的转义逻辑,不需要手动加反斜杠:
Set @json = JSON_OBJECT( 'Item_Name', '60" Table', 'Item_ID', '1' ); select json_value(@json,'$.Item_Name') as Item_Name , json_value(@json,'$.Item_ID') as ID
该写法和方案1返回结果完全一致,从根源上避免了手写JSON字符串的转义错误,适合复杂JSON场景使用。
内容的提问来源于stack exchange,提问作者phazen1
相关产品推荐
相关产品推荐

