2011-04-22 15 views
5

Miałem do czynienia z dziwnym zachowaniem serwera MySQL 5.1.50. Sortuje rekordy niepoprawnie.Czy jest to błąd sortowania MySQL?

Na przykład Stworzyłem tabelę 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'); 

i złożyć zapytanie:

mysql> set names utf8; Zapytanie OK, 0 wierszy dotkniętych (0,00 s)

mysql> wybierz * z kolejności testu według tytułu asc;

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

4 rzędy w zestawie (0,00 sek)

mysql> select * od zamówienia testowego według tytułu desc;

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

4 rzędy w zestawie (0,00 s)

jak widać rekordy 3 i 4 nie zmieniają miejsca

zrobiłem takie zapytanie i niektóre litery nie zmienić zamówienie, na przykład , A i.

mysql> SELECT * FROM test ZAMÓWIENIE BY title 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 ZAMÓWIENIE 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  | 
+----+---------+ 

Myślę, że to błąd z sortowaniem.

Może ktoś wpadł na takie zachowanie serwera?

+0

Twoja konfiguracja działa zgodnie z oczekiwaniami w wersji 5.0.77.Nie znalazłem żadnej weryfikacji w Google, ale wygląda na to, że mam błąd. – Cfreak

+0

My local v5.1.41 też działa dobrze. – mindas

+0

@mindas Jakiego rodzaju sortowania masz? –

Odpowiedz

0

Skoro masz mieszaniny tekstu i wartości liczbowych, możesz spróbować rozwiązać tak:

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

jak opisano here.

[Jeśli to nie zadziała, może być w stanie zastąpić drugą instancję tytuł z asc lub desc jako pożądanego]

+0

Gdzie jest mikstura? 'title' to' varchar'. –

+0

on nie sortuje według numeru ciągu, o czym mówi twój przykład. – Hogan

1

Wydaje się być to błąd w wersji rzeczywiście.

próbowałem go z MySQL 5.5.8 i tam to posortowane prawidłowo:

 
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

Co się stanie, jeśli spróbujesz ?:

SELECT * 
FROM test 
ORDER BY title ASC 
COLLATE utf8_unicode_ci; 

Czy próbowałeś to:

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

SELECT * 
FROM test 
ORDER BY title ASC 
; 

Aby sprawdzić, czy problem (lub błąd) jest związany z długimi ciągami lub sortowaniem?

+0

Zrobiłem aktualizację alfabetem w pierwszej wiadomości – adre