mysql/mariadb JSON_VALID

问题描述 投票:0回答:1

示例在 db-fiddle here 给出。

CREATE TABLE `oa24_json` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `appnum` varchar(8) NOT NULL,
  `oa_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`oa_json`)),
  `last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci

我尝试插入的 JSON 已在 jqplay.org 上进行了验证。

当我尝试插入在 jqplay.org 验证的 JSON 时,出现 mysql/mariadb 错误代码 4025 CONSTRAINT(大概是它没有通过 JSON_VALID 测试)。

转义此 JSON 字符串中嵌入的撇号字符适用于此简单情况:

SELECT JSON_VALID('{"response":{"numFound":7,"start":0,"docs":[
{
  "patentApplicationNumber":["16286064"],
  "applicationDeemedWithdrawnDate":"0000-12-30T05:00:00Z",
  "applicationStatusNumber":120,
  "inventionTitle":["INITIATING A FUNDS TRANSFER FROM A PLAYER\'S MOBILE DEVICE TO A CASINO WALLET THAT REQUIRES HUMAN VALIDATION OF THE PLAYER\'S IDENTITY"]
}]}}') AS 'Valid ?';

但是,它不适用于 db-fiddle 示例中给出的实际(冗长)数据,该示例有 107 个嵌入式撇号。所以我的问题是:我还缺少什么才能让这个有效的 JSON 被 JSON_VALID 接受?

注意对于 db-fiddle 给出的数据,我只转义了 JSON 字符串中包含的撇号;其他转义字符(例如, JSON 字符串中的 , \") 由美国专利商标局 (USPTO) 以编程方式生成。

mysql json mariadb
1个回答
0
投票
JSON字符串包含需要客户端首先转义的字符。 更简单的解决方案是使用二进制协议(准备/执行):

MariaDB [(none)]> select version(); +----------------+ | version() | +----------------+ | 11.4.2-MariaDB | +----------------+ MariaDB [(none)]> set @my_json:='{"response":{"numFound":7,"start":0,"docs":[ { "patentApplicationNumber":["16286064"], "applicationDeemedWithdrawnDate":"0000-12-30T05:00:00Z", "applicationStatusNumber":120, "inventionTitle":["INITIATING A FUNDS TRANSFER FROM A PLAYER\'S MOBILE DEVICE TO A CASINO WALLET THAT REQUIRES HUMAN VALIDATION OF THE PLAYER\'S IDENTITY"] }]}}'; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> execute immediate("SELECT JSON_VALID(?) AS 'Valid ?'") using @my_json; +---------+ | Valid ? | +---------+ | 1 | +---------+
    
© www.soinside.com 2019 - 2024. All rights reserved.