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

INFORMATION_SCHEMA.COLUMNS sorted alphabetically initially, then a few days later sorted by ORDINAL_POSITION

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

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

return列名称按字母顺序排列,但 ORDINAL_POSITION 列中的值是正确的。

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

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

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

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

关于什么会导致 INFORMATION_SCHEMA.COLUMNS 延迟排序的任何想法,以及为什么一些客户 return 列顺序基于 INFORMATION_SCHEMA.COLUMNS 的顺序而不是 ORDINAL_POSITION?

任何已知的 server/DB 设置可以帮助解决这个问题?

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

======= UPDATE/EDIT =======

抱歉,我想我不小心把一个不同的 issue/behavior 混为一谈了,这是由于一个已经修复的单独问题。这次 SELECT 查询中的列顺序可能没有错,因为这是之前解决的另一个问题,是由于升级期间的配置问题造成的。

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

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

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

If an <order by clause> is not specified, then the ordering of the rows ... is implementation-dependent.

您会在很多地方以某种形式发现它。

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

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

您需要更新查询。