【问题标题】:Same Query But ORDER BY Producing Different Results相同的查询但 ORDER BY 产生不同的结果
【发布时间】:2019-07-25 05:14:15
【问题描述】:

我正在运行两台 MySQL 服务器(生产和测试)。我通过 MySQL Workbench 在两者上运行相同的查询,但结果的顺序不同。是什么原因?

查询:

select table_name, table_collation 
from information_schema.tables 
where table_schema = 'orchestration' 
order by table_name asc`

【问题讨论】:

  • MySQL的生产实例和测试实例是否运行相同的版本?
  • Bill Karwin,测试版本为 8.0.11;生产是 5.6.33

标签: mysql sql sql-order-by collation


【解决方案1】:
select  table_name, table_collation
    from  information_schema.tables
    order by  table_name COLLATE utf8_general_ci;

注意事项:

  • S _ s -- 所以如果有人在做UPPER()LOWER(),顺序就会改变。
  • utf8_bin 和 utf8_general_ci 给出不同的答案;也许底层 DD 表发生了变化?

(唉,我没能找到问题的根源。)

【讨论】:

    【解决方案2】:

    测试版本为8.0.11;生产是 5.6.33

    MySQL 8.0 完全改变了 INFORMATION_SCHEMA 的内部实现。有关公告,请参阅https://mysqlserverteam.com/mysql-8-0-improvements-to-information_schema/

    我还看到您在测试中使用 utf8 排序规则,但在生产中使用 utf8mb4,并且再次使用不同的版本。 MySQL 还对版本之间的排序规则进行了更正。有时他们的旧实现存在错误,有时一些标准委员会更新了排序规则的规范,并且 MySQL 进行了更改以保持与标准的兼容性。

    许多软件包会在主要版本之间进行更改,您不应期望它们之间具有完美的兼容性。

    您应确保使用技术堆栈中所有软件包的相同版本进行开发、测试和部署到生产环境。数据库、语言、框架、Web 服务器、缓存服务器、代理、负载平衡器、消息队列、库等都可能引入细微的变化,即使它们没有记录在案。

    如果您在一个版本上进行测试,但在不同版本的技术堆栈上部署到生产环境,您可能会对不兼容和错误感到惊讶。实际上,您的测试并不能保证您的代码可以在生产环境中运行!

    【讨论】:

    • 嗨,比尔。我想深入挖掘,但遇到了障碍。 SHOW CREATE TABLE information_schema.TABLES 原来是 VIEW,但输出被截断。在哪里可以找到新的 8.0 DD 表的架构? (为什么 SHOW 会被截断?)
    • 我在 8.0.14 的沙盒实例上试过,似乎没有截断。我使用 SHOW CREATE TABLESHOW CREATE VIEW 并将其视为 4205 个字符。 information_schema 中有趣的“视图”本身并没有出现在information_schema.views 中。
    • 我在 docker 中使用了 8.0.15。输出没有给出FROMJOIN 来告诉我基础表在哪里。你能告诉我它们是什么吗?是否可以对它们进行SHOW 处理?
    • 基础表是mysql.tablesmysql.schematamysql.catalogsmysql.collationsmysql.tablespacesmysql.table_stats。这些是内部数据字典对象,它们无法显示:ERROR 3554 (HY000): Access to data dictionary table 'mysql.tables' is rejected. 这是一个解释:lefred.be/content/…
    • 谢谢,但是啊。当我有空闲的一周时,我会追求它。即使我可以看到“隐藏”表,也可能无法解释为什么 _ 的整理方式似乎有所不同。
    【解决方案3】:

    与服务器相比,您的排序规则是否可能在本地有所不同?例如。您使用mysqld --character-set-server=utf8mb4 启动本地,还是与生产服务器完全不同的东西?

    此外,底层操作系统的行为可能有所不同。我不记得看到过以不同方式对 '_' 和 's' 进行排序的特定字符集,但我想这是可能的。

    【讨论】:

    • 我在原帖中添加了截图;这有帮助吗?
    • Bill Karin 的上述回答更符合目标;不同的版本会让您头疼(而不仅仅是 MySQL 问题!)。您可以导出测试数据库,并在测试中加载到相同的版本吗?
    • 看来这就是我必须要去的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多