五年前,MySQL 8.0 就发布了第一个 GA 版本,此后一直在这个版本进行更新,而没有升级大版本。最近 MySQL 官方终于发布了 MySQL 8.1.0 和 MySQL 8.0.34,分别代表了创新版和长期支持版。
新版本中与 SQL 相关的改进包括保存执行计划输出和使用系统函数作为字符字段的默认值。
MySQL 8.1.0 版本支持将 EXPLAIN FORMAT=JSON 命令的输出结果保存为一个用户变量,语法如下:
EXPLAIN FORMAT=JSON INTO var_name
explainable_stmt
变量的值是一个 JSON 文档,可以进一步使用 JSON 函数 (例如 JSON_EXTRACT())进行处理。
其中,INTO 子句只支持 FORMAT=JSON 选项,系统变量 explain_format 设置的 JSON 格式无效。如果 explainable_stmt 无法执行,用户变量的值不会被更新。
INTO 子句不支持 EXPLAIN ANALYZE 和 EXPLAIN FOR CONNECTION 语句。
关于 EXPLAIN 命令的详细介绍,可以参考官方文档。
https://dev.mysql.com/doc/refman/8.1/en/explain.html#explain-execution-plan
MySQL 8.1.0 和 MySQL 8.0.34 支持使用系统函数 CURRENT_USER()、SESSION_USER()、USER() 以及 SYSTEM_USER() 作为 VARCHAR 和 TEXT 字段的默认值。例如:
mysql> SELECT CURRENT_USER();
+-------------------+
| CURRENT_USER() |
+-------------------+
| sakila@localhost |
+-------------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE t (
> c1 VARCHAR(288) DEFAULT (USER()),
> c2 VARCHAR(288) DEFAULT (CURRENT_USER()),
> c3 VARCHAR(288) DEFAULT (SESSION_USER()),
> c4 VARCHAR(288) DEFAULT (SYSTEM_USER())
> );
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO t VALUES ROW();
Query OK, 1 row affected (0.01 sec)
mysql> TABLE t;
+-------------------+-------------------+-------------------+-------------------+
| c1 | c2 | c3 | c4 |
+-------------------+-------------------+-------------------+-------------------+
| sakila@localhost | sakila@localhost | sakila@localhost | sakila@localhost |
+-------------------+-------------------+-------------------+-------------------+
1 row in set (0.00 sec)
如果我们使用 SHOW CREATE TABLE 和 SHOW COLUMNS 命令查看表结构时,可以看到定义中的函数。另外,也可以通过系统表 INFORMATION_SCHEMA.COLUMNS 的 COLUMN_DEFAULT 字段查看默认值。
如果想要确保可以存储最大可能的数据长度,定义的字段长度至少为 288 个字符(用户名占用 255、主机名占用 32、加上一个 @ 符号)。定义 CHAR 类型的字段时,不推荐使用以上系统函数作为默认值,因为可能会导致错误或者数据丢失。