10.7 功能预览:杂项特性

“杂项特性”预览版包含了所有未能单独放入专门预览二进制文件中的其他特性。


MariaDB Server 10.7 包含了 JSON_EQUALS 函数,该函数将输入作为 JSON 对象进行比较,而无需考虑空格、键顺序或数字格式。

例如,正如你所料,这两个字符串将被评估为相等的 JSON 对象

> SELECT JSON_EQUALS(
'{"name":"alice","color":"blue"}'
,'
{
    "color": "blue",
    "name":  "alice"
}
');

尽管在少数情况下很方便,但 JSON_EQUALS 本身可能不太引人注目,因为我们的应用程序很少需要使用数据库内的 SQL 测试两个值的相等性。

但是,我们可能希望应用程序利用数据库对 JSON 内容强制执行唯一约束,并且可以使用 JSON_NORMALIZE 函数结合唯一键来实现这一点。

例如,如果我们有一个带 JSON 列的表

> CREATE TABLE t1 (
 id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
 val JSON,
 /* other columns here */
 PRIMARY KEY (id)
);

在 MariaDB 10.7 中,我们可以使用 JSON_NORMALIZE 添加唯一约束,如下所示

> ALTER TABLE t1
   ADD COLUMN jnorm JSON AS (JSON_NORMALIZE(val)) VIRTUAL,
   ADD UNIQUE KEY (jnorm);

我们可以通过先正常插入一行来测试这一点

> INSERT INTO t1 (val) VALUES ('{"name":"alice","color":"blue"}');

然后看看使用一个生成相同 JSON 对象的不同字符串会发生什么

> INSERT INTO t1 (val) VALUES ('{ "color": "blue", "name": "alice" }');

ERROR 1062 (23000): Duplicate entry '{"color":"blue","name":"alice"}' for key 'jnorm'

MariaDB 10.7 的 JSON_EQUALS 和 JSON_NORMALIZE 函数旨在使现代 Web 应用程序的开发人员使用 JSON 和 SQL 数据库更加自然。


10.7 中的字符串比较速度提高了三倍。这对于用于各种标识符(例如表名和列名)的 utf8 字符集尤为重要,因为它们在执行每个查询的过程中会被多次比较。请参阅 MDEV-26572 中的基准测试结果。


如果你使用系统版本化表,你可能会很高兴知道在 10.7 中,你可以在任何特定时间点创建版本化表的表转储

mysqldump --as-of="2020-09-28 00:00" my_db my_versioned_table

在 10.7 中,我们应用了一个贡献的补丁(感谢 woqutech),该补丁为我们的多源复制特性实现了与 MySQL 兼容的 CHANNEL 语法。


你以前可能使用过 GET DIAGNOSTICS。在出现错误或警告后,可以使用它以编程方式检索 sqlstate、错误编号和文本。这在存储过程的条件处理程序中特别有用。例如,

GET DIAGNOSTICS CONDITION 2 @sqlstate = RETURNED_SQLSTATE,
  @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;

SELECT @sqlstate, @errno, @text;
+-----------+--------+----------------------------------------+
| @sqlstate | @errno | @text                                  |
+-----------+--------+----------------------------------------+
| 01000     |   1265 | Data truncated for column 'c' at row 2 |
+-----------+--------+----------------------------------------+

但到目前为止,除了解析错误文本外,没有办法知道错误发生在哪个行。在 10.7 中,可以使用 ERROR_INDEX 属性来检索行号。即使错误文本没有提及它

INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'

GET DIAGNOSTICS CONDITION 1 @row_num= ERROR_INDEX;

SELECT @row_num;
+----------+
| @row_num |
+----------+
|        2 |
+----------+

通过下载并安装tarball 来试用新功能。

欢迎提供反馈意见

如果您在此功能预览版中遇到任何问题、设计上的瑕疵或未按预期工作的边缘情况,请通过在 JIRA MDEV 项目上提交 bug/功能请求告知我们。欢迎在 Zulip 上讨论。