mysql 8结果行集案例有哪些变化?

mysql 8结果行集案例有哪些变化?,mysql,case-sensitive,mysql-8.0,Mysql,Case Sensitive,Mysql 8.0,跑步时 SELECT maxlen FROM `information_schema`.`CHARACTER_SETS`; mysql 5.7和mysql 8产生不同的结果: 在mysql 5.7上,结果行名称的大小写较低 在mysql 8上,结果行名称是大写的 注意:在字符集表中,组件名称为MAXLEN(大写) 由于我找不到记录它的资源,我的问题是: mysql 8结果行集案例有哪些变化 大小写敏感度没有变化。如果您查看mysql文档中的标识符区分大小写,则两者都会说字段名不区分大小写:

跑步时

SELECT maxlen FROM `information_schema`.`CHARACTER_SETS`;
mysql 5.7和mysql 8产生不同的结果:

  • 在mysql 5.7上,结果行名称的大小写较低
  • 在mysql 8上,结果行名称是大写的
注意:在
字符集
表中,组件名称为
MAXLEN
(大写)

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

mysql 8结果行集案例有哪些变化


大小写敏感度没有变化。如果您查看mysql文档中的标识符区分大小写,则两者都会说字段名不区分大小写:

列、索引、存储例程、事件和资源组名称在任何平台上都不区分大小写,列别名也不区分大小写


在我看来,这更像是显示差异。

大小写敏感度没有变化。如果您查看mysql文档中的标识符区分大小写,则两者都会说字段名不区分大小写:

列、索引、存储例程、事件和资源组名称在任何平台上都不区分大小写,列别名也不区分大小写


在我看来,这更像是一种显示差异。

MySQL 8.0确实改变了信息模式中某些视图的实现:

说:

现在,所有数据库表的元数据都存储在事务数据字典表中,这使我们能够设计一个信息模式表作为数据字典表上的数据库视图。这消除了在动态执行期间为每个信息模式查询创建临时表以及扫描文件系统目录以查找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
您可以通过以下两种方式解决此更改:

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

mysql 8.0.14> SELECT MAXLEN AS `maxlen` 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| maxlen |
+--------+
|      2 |
|      1 |
+--------+
您可以养成在8.0之前以大写形式查询列的习惯。下面是一个在我的5.7沙盒中显示结果的测试:

mysql 5.7.24> SELECT MAXLEN 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| MAXLEN |
+--------+
|      2 |
|      1 |
+--------+

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

MySQL 8.0确实更改了信息模式中某些视图的实现:

说:

现在,所有数据库表的元数据都存储在事务数据字典表中,这使我们能够设计一个信息模式表作为数据字典表上的数据库视图。这消除了在动态执行期间为每个信息模式查询创建临时表以及扫描文件系统目录以查找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
您可以通过以下两种方式解决此更改:

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

mysql 8.0.14> SELECT MAXLEN AS `maxlen` 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| maxlen |
+--------+
|      2 |
|      1 |
+--------+
您可以养成在8.0之前以大写形式查询列的习惯。下面是一个在我的5.7沙盒中显示结果的测试:

mysql 5.7.24> SELECT MAXLEN 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| MAXLEN |
+--------+
|      2 |
|      1 |
+--------+

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

根据您所说的,我推断mysql 5.7和mysql 8-1中的结果行集中存在这种行为-视图:必须使用别名强制使用列名大小写-2-表的列名大小写是SELECTAnd中使用的,请问您是否有记录此行为的参考资料?您是否看到我在回答中提供的链接?这是MySQL工程的官方博客。如果你想要MySQL手册中的内容,你可以像我一样搜索。我(和我的一位同事)确实在MySQL手册中进行了有效搜索,但我们没有找到任何内容。感谢您的时间和定性回答。根据您所说的,我推断mysql 5.7和mysql 8-1中的结果行集中存在这种行为-视图:列名大小写必须使用别名强制-2-表的列名大小写是SELECTAnd中使用的,请问您是否有记录此行为的参考资料?您是否看到我在回答中提供的链接?这是MySQL工程的官方博客。如果你想要MySQL手册中的内容,你可以像我一样搜索。我(和我的一位同事)确实在MySQL手册中进行了有效搜索,但我们没有找到任何内容。感谢您的时间和定性回答。注意:我拒绝编辑问题标题,因为我的问题是一般性的:我发现了一个症状,我想知道原因是什么。注意:我拒绝编辑问题标题,因为我的问题是一般性的:我发现了一个症状,我想知道原因是什么。正如@Bill Karwin所指出的,更改在结果行集中。@Bruno从mysql的角度来看,这些更改是无关的,因为字段名不区分大小写。这个问题只讨论mysql,没有其他问题。严格地说,比尔回答了一个不同的问题,这个问题只在其他人删除的答案中指出。以上问题的答案是:mysql的大小写敏感度没有改变。您的应用程序代码区分大小写。我不同意:它以unituitive的方式更改了,但确实更改了:结果行集索引名是mysql api的一部分。@Shadow,您回答的是OP的文字问题,但Bruno使用的术语不精确