相同的查询,但 ORDER BY 产生不同的结果

Same Query But ORDER BY Producing Different Results

提问人:Robert S 提问时间:3/4/2019 最后编辑:GMBRobert S 更新时间:3/7/2019 访问量:657

问:

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

查询:

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

Here's the actual output

MySQL SQL SQL排序 规则

评论

0赞 Bill Karwin 3/4/2019
MySQL的生产实例和测试实例是否运行相同的版本?
0赞 Robert S 3/4/2019
Bill Karwin,测试版本为 8.0.11;生产是 5.6.33

答:

0赞 Jupe 3/4/2019 #1

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

此外,基础操作系统的行为可能不同。我不记得看到过对“_”和“s”进行不同排序的特定字符集,但我想这是可能的。

评论

0赞 Robert S 3/4/2019
我在原来的帖子中添加了一张截图;这有帮助吗?
0赞 Jupe 3/4/2019
比尔·卡琳(Bill Karin)上面的回答更有针对性;不同的版本会给你带来一个令人头疼的世界(而不仅仅是MySQL问题!是否可以导出测试数据库,并加载到测试中的相同版本?
0赞 Robert S 3/4/2019
看来这就是我必须去的方向!
1赞 Bill Karwin 3/4/2019 #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 服务器、缓存服务器、代理、负载平衡器、消息队列、库等都可能引入细微的变化,即使它们没有记录在案。

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

评论

0赞 Rick James 3/7/2019
嗨,比尔。我想更深入地挖掘,但我遇到了障碍。 原来是 ,但输出被截断了。在哪里可以找到新 8.0 DD 表的架构?(为什么 SHOW 被截断了?SHOW CREATE TABLE information_schema.TABLESVIEW
0赞 Bill Karwin 3/7/2019
我尝试了 8.0.14 的沙盒实例,它似乎没有被截断。我使用 or 并将其视为 4205 个字符。有趣的是,information_schema中的“视图”本身并没有出现在 .SHOW CREATE TABLESHOW CREATE VIEWinformation_schema.views
0赞 Rick James 3/7/2019
我在 docker 中使用了 8.0.15。输出没有达到给出或告诉我基础表的位置。你能告诉我它们是什么吗?有可能对他们做吗?FROMJOINSHOW
0赞 Bill Karwin 3/7/2019
基础表是 、 、 、 、 。这些是内部数据字典对象,它们不可显示:这里有一个解释:lefred.be/content/...mysql.tablesmysql.schematamysql.catalogsmysql.collationsmysql.tablespacesmysql.table_statsERROR 3554 (HY000): Access to data dictionary table 'mysql.tables' is rejected.
0赞 Rick James 3/7/2019
谢谢,但是呃。当我有空闲的一周时,我会追求这一点。即使我能看到“隐藏”的表格,它也可能无法解释为什么似乎以不同的方式进行整理。_
0赞 Rick James 3/7/2019 #3
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 表发生了变化?

(唉,我无法弄清楚问题的根源。