ORDER BY UPPER(列)错误

时间:2015-05-20 09:22:23

标签: mysql sql sql-order-by mysql-5.6

使用MySQL 5.6,给出以下表结构:

mysql> describe groups;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(500) | YES  |     | NULL    |                |
| description | varchar(200) | YES  |     | NULL    |                |
| created_at  | datetime     | YES  |     | NULL    |                |
| updated_at  | datetime     | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

以下数据在

`groups` table:

mysql> select id, name from groups;
+----+------------------+
| id | name             |
+----+------------------+
|  1 | some-users       |
|  2 | SOME-ADMINS      |
|  3 | customers-group1 |
|  4 | customers-group2 |
|  5 | customers-group3 |
+----+------------------+
5 rows in set (0.00 sec)

以下查询在MySQL中排序很糟糕(而在至少PostgreSQL,Oracle和MSSQL中它可以正常工作):

mysql> select id, name from groups order by upper(name);
+----+------------------+
| id | name             |
+----+------------------+
|  3 | customers-group1 |
|  4 | customers-group2 |
|  5 | customers-group3 |
|  1 | some-users       |
|  2 | SOME-ADMINS      |
+----+------------------+
5 rows in set (0.00 sec)

我希望:

SOME-ADMINS出现在some-users之前,与其他数据库供应商的情况一样。

这是MySQL的错误吗?

1 个答案:

答案 0 :(得分:4)

根据文档,它不区分大小写,但您可以使用BINARY使其区分大小写:

  

在字符类型列上,排序与所有其他比较操作一样,通常以不区分大小写的方式执行。这意味着除了它们的情况之外,对于相同的列,订单是未定义的。您可以使用BINARY强制对列进行区分大小写的排序,如下所示:ORDER BY BINARY col_name。

https://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html