MySQL 5.7 JSON_EXTRACT 不适用于对象中的带引号的字符串:[错误]“字符串中缺少右引号”
Posted
技术标签:
【中文标题】MySQL 5.7 JSON_EXTRACT 不适用于对象中的带引号的字符串:[错误]“字符串中缺少右引号”【英文标题】:MySQL 5.7 JSON_EXTRACT does not work with quoted strings within the object: [ERROR] "Missing a closing quotation mark in string" 【发布时间】:2019-01-31 10:44:28 【问题描述】:我无法在 mysql 5.7 中使用 JSON_EXTRACT 函数提取带引号的字符串。
示例输入:
"email": "d'souza@email.com",
"body": "I may have "random quotes '(single)/(double)" " in my source data"
尝试使用,
SELECT
@valid_source := JSON_VALID(jsonString), NULL
IF(@valid_source, JSON_UNQUOTE(JSON_EXTRACT(jsonString, "$.email")), NULL)
我收到一条错误消息:函数 json_extract 的参数 1 中的 JSON 文本无效:“字符串中缺少右引号。”在位置 xxx
任何帮助将不胜感激,谢谢!
【问题讨论】:
奇怪的错误,因为我不相信 JSON 应该通过JSON_VALID
函数
您的查询中有一个杂散的NULL
,但这应该会产生另一个错误。确定您发布了正确的查询?因为除此之外,它对我有用:rextester.com/DVZ80948
谢谢你们的回复。查询是我正在使用的,但是示例数据可能不同。我正在查询超过 500 万条记录,并且在 SELECT 查询之间出现此错误。不确定,是否只是因为角落用例或查询本身不正确。
这里的 JSON 明显违反了规范。目前尚不清楚您是否意识到这一点。如果JSON_VALID()
真的返回true,那是mysql 中的一个错误,但是在SELECT
中使用用户定义的变量进行赋值不是确定性的,所以你写的查询实际上并不能证明@valid_source 之前被设置为true IF()
被评估,如果有的话。
这是对我有用的修复方法:我使用 运算符 "-->" 而不是 JSON_UNQUOTE(JSON_EXTRACT("jsonString")) 并没有抛出我我的输入字符串中任何类型的引号的任何错误。请注意,上面的示例 JSON 只是我在输入中期望的用例之一。我有大约 400 万条记录,所有不同的字符组合并使用运算符而不是实际命令工作得非常好,这很奇怪,因为两者都是相同的,但我很高兴我可以使用一个小修复来解决它。
【参考方案1】:
这是对我有用的修复: 我使用 运算符 "-->" 而不是 JSON_UNQUOTE(JSON_EXTRACT("jsonString")) 并且它没有对我的输入字符串中的任何类型的引号抛出任何错误。请注意,上面的示例 JSON 只是我在输入中期望的用例之一。我有大约 400 万条记录,所有不同的字符和引号组合,因为它包含电子邮件正文,并且使用运算符而不是实际命令工作得非常好,这很奇怪,因为两者本质上是相同的,但我很高兴我可以通过一个小修复来解决它。
@valid_json := JSON_VALID(inputString),
IF(@valid_json, inputString ->> '$.email', NULL) AS EMAIL,
【讨论】:
以上是关于MySQL 5.7 JSON_EXTRACT 不适用于对象中的带引号的字符串:[错误]“字符串中缺少右引号”的主要内容,如果未能解决你的问题,请参考以下文章
使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
GROUP BY不适用于MySQL 5.7,因为5.7使用SQL_MODE的“ONLY_FULL_GROUP_BY”选项。
已解决:源 “MySQL 5.7 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确 和 报错:`ERROR 1045 (28000