【问题标题】:What collation does MySQL use by default for ORDER BY?MySQL 默认对 ORDER BY 使用什么排序规则?
【发布时间】:2012-02-27 18:37:59
【问题描述】:

这些查询都给出了我期望的结果:

SELECT sex
FROM ponies
ORDER BY sex COLLATE latin1_swedish_ci ASC

SELECT sex
FROM ponies
ORDER BY CONVERT(sex USING utf8) COLLATE utf8_general_ci ASC

| f |
| f |
| m |
| m |
+---+

但是这个查询给出了不同的结果:

SELECT sex FROM ponies ORDER BY sex ASC

| m |
| m |
| f |
| f |
+---+

这是配置:

SHOW VARIABLES LIKE 'collation\_%'

| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

表格排序规则是latin1_swedish_ci。

MySQL 服务器是 5.5.16。

【问题讨论】:

  • 请添加create table声明。

标签: mysql collation


【解决方案1】:

表格排序规则

排序规则默认值是按表存储的。有一个服务器设置的默认值,但它在创建表时应用到它。

要查找特定表的排序规则,请运行以下查询:

SHOW TABLE STATUS LIKE 'ponies'\G

你应该看到这样的输出:

*************************** 1. row ***************************
           Name: ponies
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 8
 Avg_row_length: 20
    Data_length: 160
Max_data_length: 5629499534213119
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2012-02-27 10:16:25
    Update_time: 2012-02-27 10:17:40
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

您可以在该结果中看到Collation 设置。

列排序规则

您还可以覆盖表中特定列的排序规则设置。像这样的 create table 语句将创建一个 latin1_swedish_ci 表,其中包含一个 utf8_polish_ci 列:

CREATE TABLE ponies (
    sex CHAR(1) COLLATE utf8_polish_ci
) CHARACTER SET latin1 COLLATE latin1_swedish_ci;

查看这个结果的最好方法是这样的:

SHOW FULL COLUMNS FROM ponies;

输出:

+-------+---------+----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type    | Collation      | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+---------+----------------+------+-----+---------+-------+---------------------------------+---------+
| sex   | char(1) | utf8_polish_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+---------+----------------+------+-----+---------+-------+---------------------------------+---------+
1 row in set (0.00 sec)

【讨论】:

  • 正如我所写,表格排序规则是latin1_swedish_ci,那么ORDER BY sex COLLATE latin1_swedish_ci ASC 和ORDER BY sex ASC 之间为什么会有区别?
  • 抱歉,我没有看到最后一行;我以为你在看服务器配置而不是表配置
  • 尝试SHOW FULL COLUMNS 查询,看看是否能提供更多相关信息。
  • 没什么特别的,排序规则是latin1_swedish_ci。无论如何,我刚刚创建了数据库。顺便说一句,你能重现我的观察吗?
  • 我实际上在另一个选项卡的屏幕上有dev.mysql.com/doc/refman/5.5/en/…,完全错过了它。不过,很高兴你抓住了这一点。
【解决方案2】:

The documentation 表示默认情况下它使用不区分大小写的字符比较。我不明白为什么你没有得到那个结果。

文档还建议使用binary 限定符进行区分大小写的比较。我想知道这是否会影响您的结果?:

SELECT sex FROM ponies ORDER BY BINARY sex ASC

【讨论】:

  • 是的,这也给出了预期的结果。那么将 m 放在 f 之前是什么奇怪的排序顺序(是否区分大小写)? (是的,我的表格值都是小写的。)
  • 对于m 或f,其中一个字段值是否可能是扩展的UTF 表示(不是ASCII)?
  • SELECT HEX(sex) FROM ponies 显示 66 和 6D,ORDER BY sex ASC 排序 6Dbefore 66。
  • 啊,我忘了它是一个 ENUM。这解释了一切。对不起。 :(
【解决方案3】:

当sex 是ENUM 时可以观察到这种行为,在这种情况下,它通常按ENUM 定义中的数字位置排序。仅当明确给出排序规则时,它才会按字母顺序排序。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2010-10-18
    • 2018-12-19
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多