【问题标题】:MySQL SELECT * fails upon UnicodeMySQL SELECT * 在 Unicode 上失败
【发布时间】:2019-09-14 22:48:15
【问题描述】:

背景信息:我有一张 country_types 表。字符集设置为 utf8mb4,排序规则设置为 utf8mb4_0900_ai_ci。

当我运行 SELECT * FROM DB.country_types; 时,我得到以下信息:

但是,如您所见,条目号 29 丢失了。当我过滤到条目 29 时,它会显示条目 29,即使 SELECT * 语句没有选择条目 29。

条目 29 使用与其他行不同的特殊 unicode 字符。我想知道如何解决这个问题,以便在 SELECT 语句中返回条目 29。

【问题讨论】:

  • SELECT * FROM DB.country_types ORDER BY country_id 返回什么?
  • @GMB 它正确返回条目 29。我的问题是为什么正常的 SELECT * 不会返回该条目?给定表格的编码和排序规则。
  • 它可能在列表的末尾。如果没有 order by 子句,则 select 语句会返回一个无序列表。
  • 你可能在(name) 上有一个索引,引擎决定从我的name 订购的索引中读取记录。

标签: mysql sql mysql-workbench


【解决方案1】:

当我运行SELECT * FROM DB.country_types [...] 时,您可以看到条目号 29 丢失了。

它没有丢失,只是没有在您期望的位置显示。这不是编码的问题。您必须记住,在任何 SQL 数据库中,记录都是无序的,除非指定了ORDER BY 子句。如果不指定这样的子句,则查询返回的记录顺序是不可预测的。

如果您希望在 28 到 30 之间始终看到条目 29,则需要在查询中添加 ORDER BY 子句,例如:

SELECT * FROM DB.country_types ORDER BY id;

【讨论】:

  • 这很有意义。我重新启动了我的计算机和我的 MySQL Workbench,它出现了。尽管订购了所有其他条目,但它没有被订购。感谢您的帮助。
  • 欢迎@WarrenNiles!最重要的是,不要假设记录的某些固有顺序...除非存在 ORDER BY 子句。
猜你喜欢
  • 2021-03-15
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2017-04-23
相关资源
最近更新 更多