INFORMATION_SCHEMA.COLUMNS 最初按字母顺序排序,几天后按 ORDINAL_POSITION 排序

Posted

技术标签:

【中文标题】INFORMATION_SCHEMA.COLUMNS 最初按字母顺序排序,几天后按 ORDINAL_POSITION 排序【英文标题】:INFORMATION_SCHEMA.COLUMNS sorted alphabetically initially, then a few days later sorted by ORDINAL_POSITION 【发布时间】:2021-10-27 18:23:00 【问题描述】:

mysql 8.0.25(Windows 上的 InnoDB 引擎)从 MariaDB(10.1.26,我不认为我们在 Linux 上使用 InnoDB 引擎)升级后,每次我们的数据库服务器重新启动时,我们都会遇到这个问题:

SELECT * INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = insert table name here;

按字母顺序返回列名,尽管 ORDINAL_POSITION 列中的值是正确的。

SELECT * FROM insert table name here WHERE 1=0;

这会返回按字母顺序排列的列,而不是在某些客户端中按 ORDINAL_POSITION 排序(LabView 查询似乎主要受此影响)。

几天后,一切恢复正常,SELECT 语句始终按 ORDINAL_POSITION 对列进行排序,INFORMATION_SCHEMA.COLUMNS 按预期按 ORDINAL_POSITION 排序。

不幸的是,由于我们的一些程序依赖于列顺序在 SQL 查询结果中是一致的,这造成了很多麻烦,我们似乎在绕圈子试图弄清楚。

有什么想法会导致 INFORMATION_SCHEMA.COLUMNS 排序延迟,以及为什么有些客户端会根据 INFORMATION_SCHEMA.COLUMNS 的顺序而不是 ORDINAL_POSITION 返回列顺序?

任何已知的服务器/数据库设置来帮助解决这个问题?

谢谢,抱歉,这超出了我的知识库,所以这不是一个很好的内容或问题风格的帖子。

======= 更新/编辑 =======

抱歉,我想我不小心把一个不同的问题/行为归为一类,这是由于一个已经修复的单独问题造成的。这次 SELECT 查询中的列顺序可能没有不正确,因为这是以前解决的另一个问题,并且是由于升级期间的配置问题造成的。

本质上,问题似乎是由于假设 INFORMATION_SCHEMA.COLUMNS 视图始终具有相同的排序顺序,我认为@Tangenially Perpendicular 的回答证实了不能假设。

旁注,FlySpeed SQL 查询(已提交的问题)似乎也假设了这一点,Heidi SQL(已修复)在某一时刻也是如此。

【问题讨论】:

进一步注意,MySQL 5.x、MySQL 8.0 和 MariaDB 之间存在足够的差异,因此您不应该假设任何一致性——即使 information_schema 中的表和列是什么,在SELECTs 的顺序。 EXPLAIN、sql_modes 等列也是如此。 感谢您的解释。这就是我试图告诉上级的内容,但后来我也陷入了他们认为是当前问题的一部分的一些错误信息中(因此进行了编辑)。我相信我们目前面临的实际问题是 LabView 超时(未报告错误),而不是 SELECT 中的列排序不正确,然后 SQL 查看器 FlySpeed SQL Query 显示列乱序(单独的小问题),具有误导性人们相信这是一个相关的问题。 【参考方案1】:

在 SQL 中,顺序不是数据集的固有属性。 SQL-92 spec 中出现的措辞是

如果未指定 ,则行的顺序...取决于实现。

你会在很多地方以某种形式找到它。

没有服务器范围或数据库范围的选项来设置它。您需要在查询中指定所需的顺序。你上面的例子变成了

SELECT * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <your table name> order by ORDINAL_POSITION;

您需要更新查询。

【讨论】:

以上是关于INFORMATION_SCHEMA.COLUMNS 最初按字母顺序排序,几天后按 ORDINAL_POSITION 排序的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库中的约束列表

MySQL and Sql Server:Getting metadata using sql script (SQL-92 standard)

数据库外键的查看与删除