MySQL默认为ORDER BY使用什么排序规则?

时间:2012-02-27 18:37:59

标签: mysql collation

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

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。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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

SELECT sex FROM ponies ORDER BY BINARY sex ASC

答案 2 :(得分:0)

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