mysql 8 结果行集大小写有哪些变化?

Bru*_*uno 5 mysql case-sensitive mysql-8.0

跑步时

SELECT maxlen FROM `information_schema`.`CHARACTER_SETS`;
Run Code Online (Sandbox Code Playgroud)

mysql 5.7 和 mysql 8 产生不同的结果:

  • 在 mysql 5.7 上,结果行名称是小写的,
  • 在 mysql 8 上,结果行名称是大写的。

注意:在CHARACTER_SETS表中,公共名称是MAXLEN(大写)。

由于我找不到记录它的资源,我的问题是:

mysql 8 结果行集大小写有哪些变化?

Bil*_*win 7

MySQL 8.0 确实改变了INFORMATION_SCHEMA 中某些视图的实现。

现在所有数据库表的元数据都存储在事务数据字典表中,它使我们能够设计一个 INFORMATION_SCHEMA 表作为数据字典表的数据库视图。这消除了诸如在动态执行期间为每个 INFORMATION_SCHEMA 查询创建临时表以及扫描文件系统目录以查找 FRM 文件等成本。现在还可以利用 MySQL 优化器的全部功能,使用数据字典表上的索引来准备更好的查询执行计划。

因此,这样做是有充分理由的,但我知道,当您根据列名获取关联数组中的结果时,它会扰乱您的一些查询。

您可以看到视图的定义显式声明了大写的列名:

mysql 8.0.14> SHOW CREATE VIEW CHARACTER_SETS\G
*************************** 1. row ***************************
                View: CHARACTER_SETS
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql.infoschema`@`localhost` SQL SECURITY DEFINER VIEW `CHARACTER_SETS` AS 
  select 
    `cs`.`name` AS `CHARACTER_SET_NAME`,
    `col`.`name` AS `DEFAULT_COLLATE_NAME`,
    `cs`.`comment` AS `DESCRIPTION`,
    `cs`.`mb_max_length` AS `MAXLEN` -- delimited column explicitly uppercase
  from (`mysql`.`character_sets` `cs` 
  join `mysql`.`collations` `col` on((`cs`.`default_collation_id` = `col`.`id`)))

character_set_client: utf8
collation_connection: utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

您可以通过以下几种方式来解决此更改:

您可以在查询视图时根据需要声明自己的列别名:

mysql 8.0.14> SELECT MAXLEN AS `maxlen` 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| maxlen |
+--------+
|      2 |
|      1 |
+--------+
Run Code Online (Sandbox Code Playgroud)

在 8.0 之前,您可以养成以大写形式查询列的习惯。这是在我的 5.7 沙箱中显示结果的测试:

mysql 5.7.24> SELECT MAXLEN 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| MAXLEN |
+--------+
|      2 |
|      1 |
+--------+
Run Code Online (Sandbox Code Playgroud)

或者,您可以将结果提取到非关联数组中,并按列号(而不是按名称)引用列。