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 上讨论。