2011-04-22 88 views
5

我曾经面对奇怪的服务器行为MySQL 5.1.50。它不正确地排序记录。这是一个MySQL的排序错误?

例如我已经创建了一个表test

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(250) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


INSERT INTO `test` (`id`, `title`) VALUES 
(1, 'record1'), 
(2, 'record2'), 
(3, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 
(4, 'ABCDEFGHIJKLMNOPQRSTUVWXYY'); 

并进行查询:

的MySQL>集名称UTF8; Query OK,0 rows affected(0.00 sec)

mysql> select * from test order by title asc;在集

+----+----------------------------+ 
| id | title      | 
+----+----------------------------+ 
| 3 | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 
| 4 | ABCDEFGHIJKLMNOPQRSTUVWXYY | 
| 1 | record1     | 
| 2 | record2     | 
+----+----------------------------+ 

4行(0.00秒)

的MySQL> SELECT * FROM由标题递减测试顺序;在集

+----+----------------------------+ 
| id | title      | 
+----+----------------------------+ 
| 2 | record2     | 
| 1 | record1     | 
| 3 | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 
| 4 | ABCDEFGHIJKLMNOPQRSTUVWXYY | 
+----+----------------------------+ 

4行(0.00秒)

正如你看到的记录3和4不改变

我做这样的查询地点和一些字母不会改变的目的,例如,A和a。

mysql> SELECT * FROM test ORDER BY标题COLLATE utf8_unicode_ci ASC;

+----+---------+ 
| id | title | 
+----+---------+ 
| 1 | A  | 
| 27 | a  | 
| 28 | b  | 
| 2 | B  | 
| 29 | c  | 
| 3 | C  | 
| 4 | D  | 
| 30 | d  | 
| 31 | e  | 
| 5 | E  | 
| 6 | F  | 
| 32 | f  | 
| 33 | g  | 
| 7 | G  | 
| 34 | h  | 
| 8 | H  | 
| 35 | i  | 
| 9 | I  | 
| 36 | j  | 
| 10 | J  | 
| 11 | K  | 
| 37 | k  | 
| 12 | L  | 
| 38 | l  | 
| 39 | m  | 
| 13 | M  | 
| 40 | n  | 
| 14 | N  | 
| 41 | o  | 
| 15 | O  | 
| 42 | p  | 
| 16 | P  | 
| 17 | Q  | 
| 43 | q  | 
| 44 | r  | 
| 18 | R  | 
| 19 | S  | 
| 45 | s  | 
| 20 | T  | 
| 46 | t  | 
| 21 | U  | 
| 47 | u  | 
| 48 | v  | 
| 22 | V  | 
| 49 | w  | 
| 23 | W  | 
| 50 | x  | 
| 24 | X  | 
| 25 | Y  | 
| 51 | y  | 
| 26 | Z  | 
| 52 | z  | 
+----+---------+ 

mysql> SELECT * FROM test ORDER BY title COLLATE utf8_unicode_ci DESC;

+----+---------+ 
| id | title | 
+----+---------+ 
| 52 | z  | 
| 26 | Z  | 
| 25 | Y  | 
| 51 | y  | 
| 50 | x  | 
| 24 | X  | 
| 49 | w  | 
| 23 | W  | 
| 48 | v  | 
| 22 | V  | 
| 47 | u  | 
| 21 | U  | 
| 20 | T  | 
| 46 | t  | 
| 45 | s  | 
| 19 | S  | 
| 18 | R  | 
| 44 | r  | 
| 17 | Q  | 
| 43 | q  | 
| 16 | P  | 
| 42 | p  | 
| 41 | o  | 
| 15 | O  | 
| 40 | n  | 
| 14 | N  | 
| 39 | m  | 
| 13 | M  | 
| 12 | L  | 
| 38 | l  | 
| 11 | K  | 
| 37 | k  | 
| 10 | J  | 
| 36 | j  | 
| 9 | I  | 
| 35 | i  | 
| 8 | H  | 
| 34 | h  | 
| 7 | G  | 
| 33 | g  | 
| 32 | f  | 
| 6 | F  | 
| 5 | E  | 
| 31 | e  | 
| 4 | D  | 
| 30 | d  | 
| 29 | c  | 
| 3 | C  | 
| 2 | B  | 
| 28 | b  | 
| 1 | A  | 
| 27 | a  | 
+----+---------+ 

我认为这是排序错误。

可能是有人遇到过这种行为的服务器?

+0

您的设置在5.0.77中按预期工作。我在Google上没有找到任何验证,但它看起来像一个bug – Cfreak 2011-04-22 15:07:34

+0

我的本地v5.1.41也正常工作。 – mindas 2011-04-22 15:08:34

+0

@mindas你有什么样的排序规则? – 2011-04-22 15:09:45

回答

0

既然你有文本和数值的混合物,可以尝试进行排序是这样的:

mysql> select * from test order by length(title), title; 

描述here

[如果不工作,你可以用ascdesc更换标题,第二个实例根据需要]

+0

混合物在哪里? 'title'是一个'varchar'。 – 2011-04-23 11:47:33

+0

他没有按照您的示例所述的字符串数字进行排序。 – Hogan 2011-04-23 11:51:15

1

似乎是在你的版本中的错误确实如此。

我与MySQL 5.5.8尝试过了,有它的正确排序:

 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 2 
Server version: 5.5.8 MySQL Community Server (GPL) 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 

mysql> select * from test order by title asc; 
+----+----------------------------+ 
| id | title      | 
+----+----------------------------+ 
| 4 | ABCDEFGHIJKLMNOPQRSTUVWXYY | 
| 3 | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 
| 1 | record1     | 
| 2 | record2     | 
+----+----------------------------+ 
4 rows in set (0.00 sec) 

mysql> select * from test order by title desc; 
+----+----------------------------+ 
| id | title      | 
+----+----------------------------+ 
| 2 | record2     | 
| 1 | record1     | 
| 3 | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 
| 4 | ABCDEFGHIJKLMNOPQRSTUVWXYY | 
+----+----------------------------+ 
4 rows in set (0.00 sec) 

mysql> 
1

如果你尝试?:

SELECT * 
FROM test 
ORDER BY title ASC 
COLLATE utf8_unicode_ci; 

您是否尝试过这个,会发生什么:

INSERT INTO test (id, title) 
VALUES 
(101, 'A'), 
(102, 'B'), 
(103, 'C'), 
... 
(126, 'Z'); 

SELECT * 
FROM test 
ORDER BY title ASC 
; 

查看问题(或错误)是否与长字符串或整理有关?

+0

我在第一封邮件中做了一个字母更新 – adre 2011-04-28 11:29:22