我有一个数据库,它有一个名为notifications
的JSON列,其中包含一个包含电子邮件地址的对象。由于某种原因,在某些情况下,输入数据时转义了引号,而在另一些情况下,没有转义引号。当字符串被转义时,MySql将其解释为字符串。未转义时,它是一个对象
mysql> select notifications,json_type(notifications) from table group by notifications;
+--------------------------------------------------------------------------+
| notifications | json_type(notifications) |
+-----------------------------------------------+--------------------------+
| {"any": ["aaa@yyy.org", "bbb@yyy.org"]} | OBJECT |
| NULL | NULL |
| "{\"XFR\":[\"aaa@zzz.com\",\"bbb@zzz.com\"]}" | STRING |
| "{\"XFR\":[\"aaa@ccc.org\",\"bbb@ccc.org\"]}" | STRING |
+-----------------------------------------------+--------------------------+
有没有办法在MySql上放一个约束,将列限制为JSON对象,而不是字符串或数组?
如果您将一个MySQL列定义为json
类型,那么MySQL将自动验证您试图在该列中插入或更新的每个值。例如,以下代码段将失败,因为JSON的格式不正确(在对象的末尾缺少一个结尾}
):
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (jdoc JSON);
INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"');
实际上,依靠数据库级的失败来验证JSON内容可能不是最好的方法。在MySQL表中进行插入/更新之前,最好先在应用程序层验证JSON。