示例在 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) 以编程方式生成。
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 |
+---------+