Сортировка varchar по n первым символам

whisk

Новичок
Сортировка varchar по n первым символам

Имеется поле date типа varchar (20), кодировка utf-8, в котором хранятся даты вида:
2008-01-03T10:10:14
2008-01-02T08:41:38, и т.д.

Необходимо сортировать по дате, но запрос select ... order by date сортирует правильно по годам, месяцам, а дни и время в полном беспорядке. Есть подозрение, что сравнение строк производится только по первым 8 символам. Установка индексов различной длины проблемы не решает. Как быть? Структуру БД менять крайне не желательно, можно ли что-то покрутить в настройках MySQL? MySQL версии 5.0.30, таблица myisam.
Слышал об этой проблеме, но не могу найти опять ни упоминания, ни решения.
 

Фанат

oncle terrible
Команда форума
во-первых, дата должна храниться в специально предназначеном для этого поле.
во-вторых, действительно ли виноват сортировщик, а не сами данные?
 

whisk

Новичок
Собственно, select ... order by `date` asc выводит следующее:
2007-12-15T00:00:00
2007-12-29T00:00:00
2008-01-03T10:10:14
2008-01-02T08:41:38

Так что дело не в данных (или я сошел с ума). Поменять структуру -- хотелось бы, но на этот способ хранения даты слишком много завязано в скриптах.
 

Фанат

oncle terrible
Команда форума
У тебя там не 0 вместо 0? Если через одно место хранить дату - всё может быть
 

whisk

Новичок
Как есть:

CREATE TABLE `site_content_type_event` (
`vid` int(10) unsigned NOT NULL default '0',
`nid` int(10) unsigned NOT NULL default '0',
`field_event_date_value` varchar(20) default NULL,
`field_event_brief_value` longtext,
`field_event_brief_format` int(10) unsigned NOT NULL default '0',
`field_event_image_fid` int(11) NOT NULL default '0',
`field_event_image_title` varchar(255) NOT NULL default '',
`field_event_image_alt` varchar(255) NOT NULL default '',
PRIMARY KEY (`vid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Нули и буквы О там не перепутаны, конечно.
 

Gas

может по одной?
whisk
если наплевать на удобство работы, на скорость, то можешь использовать затычку STR_TO_DATE

Хотя и так должно было правильно сортировать.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
. запрос на выборку где?
 

whisk

Новичок
Сортирую в убывающем порядке:
SELECT `field_event_date_value`
FROM `site_content_type_event`
ORDER BY `field_event_date_value` DESC
получаем:
2008-01-02T08:41:38
2008-01-03T10:10:14
2007-12-08T00:00:00
2007-12-15T00:00:00
2007-12-31T00:00:00
2007-11-10T00:00:00
2007-11-17T00:00:00
2007-11-24T00:00:00
(пример сортировки в возрастающем порядке не привожу, т.к. я уже вручную забил данные в отсортированном порядке — поэтому возрастающая сортировка выдает верный результат)


Gas:
Спасибо, оно работает.

Но вопрос остается открытым — почему сам mysql не хочет сортировать нормально строки?
 

FractalizeR

Новичок
У меня все прекрасно сортирует.

SELECT * FROM `site_content_type_event` WHERE 1 LIMIT 0 , 30

Правка Удалить 2008-01-02T08:41:38
Правка Удалить 2007-12-29T00:00:00
Правка Удалить 2007-12-15T00:00:00
Правка Удалить 2008-01-02T08:41:38
Правка Удалить 2008-01-03T10:10:14
Правка Удалить 2007-12-31T00:00:00
Правка Удалить 2007-12-08T00:00:00

SELECT * FROM `site_content_type_event` ORDER BY `field_event_date_value`LIMIT 0 , 30

Правка Удалить 2007-12-08T00:00:00
Правка Удалить 2007-12-15T00:00:00
Правка Удалить 2007-12-29T00:00:00
Правка Удалить 2007-12-31T00:00:00
Правка Удалить 2008-01-02T08:41:38
Правка Удалить 2008-01-02T08:41:38
Правка Удалить 2008-01-03T10:10:14

SELECT * FROM `site_content_type_event` ORDER BY `field_event_date_value` DESC LIMIT 0 , 30

Правка Удалить 2008-01-03T10:10:14
Правка Удалить 2008-01-02T08:41:38
Правка Удалить 2008-01-02T08:41:38
Правка Удалить 2007-12-31T00:00:00
Правка Удалить 2007-12-29T00:00:00
Правка Удалить 2007-12-15T00:00:00
Правка Удалить 2007-12-08T00:00:00


Запрос на создание таблицы использовался ваш, после чего удалил из таблицы все лишние поля для удобства. Сначала тестил без индекса, потом создал неуникальный индекс по умолчанию и попробовал снова. Результат не изменился.

Изменил длину индекса на 7 - результат не изменился.

В какой версии MySQL возникает такая проблема?
 

FractalizeR

Новичок
Да, прошу прощения, не заметил. Скажите, а ваши таблицы случайно не были сконвертированы в UTF-8 из какой-то другой кодировки? Или они сразу создавались в UTF-8? Тут вот есть информация по вопросу правильного конвертирования таблиц в UTF-8: http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html
 

whisk

Новичок
Сразу в utf-8. Но на всякий случай сконвертировал в binary, а потом опять в utf-8 — толку нет.
Уже просто делаю дамп таблицы в phpmyadmin (v 2.8.1) и тут же его восстанавливаю -- не помогает.
Восстановил дамп таблицы на 4.1.16-max (стоит в денвере), на нем все работает отлично.
 

FractalizeR

Новичок
Вы не могли бы привести результат выполнения команды SHOW COLLATION LIKE "utf%" ?

Код:
utf8_general_ci  	utf8  	33  	Yes  	Yes  	1
utf8_bin 		utf8 	83 	  	Yes 	1
utf8_unicode_ci 	utf8 	192 	  	Yes 	8
utf8_icelandic_ci 	utf8 	193 	  	Yes 	8
utf8_latvian_ci 	utf8 	194 	  	Yes 	8
utf8_romanian_ci 	utf8 	195 	  	Yes 	8
utf8_slovenian_ci 	utf8 	196 	  	Yes 	8
utf8_polish_ci 		utf8 	197 	  	Yes 	8
utf8_estonian_ci 	utf8 	198 	  	Yes 	8
utf8_spanish_ci 	utf8 	199 	  	Yes 	8
utf8_swedish_ci 	utf8 	200 	  	Yes 	8
utf8_turkish_ci 	utf8 	201 	  	Yes 	8
utf8_czech_ci 		utf8 	202 	  	Yes 	8
utf8_danish_ci 		utf8 	203 	  	Yes 	8
utf8_lithuanian_ci 	utf8 	204 	  	Yes 	8
utf8_slovak_ci 		utf8 	205 	  	Yes 	8
utf8_spanish2_ci 	utf8 	206 	  	Yes 	8
utf8_roman_ci 		utf8 	207 	  	Yes 	8
utf8_persian_ci 	utf8 	208 	  	Yes 	8
utf8_esperanto_ci 	utf8 	209 	  	Yes 	8
utf8_hungarian_ci 	utf8 	210 	  	Yes 	8
Yes в предпоследнем столбце означает, что поддержка скомпилирована в бинарник сервера.
 

whisk

Новичок
Код:
 Collation  	 Charset  	 Id  	 Default  	 Compiled  	 Sortlen
utf8_general_ci 	utf8 	33 	Yes 	Yes 	1
utf8_bin 	utf8 	83 	  	Yes 	1
utf8_unicode_ci 	utf8 	192 	  	Yes 	8
utf8_icelandic_ci 	utf8 	193 	  	Yes 	8
utf8_latvian_ci 	utf8 	194 	  	Yes 	8
utf8_romanian_ci 	utf8 	195 	  	Yes 	8
utf8_slovenian_ci 	utf8 	196 	  	Yes 	8
utf8_polish_ci 	utf8 	197 	  	Yes 	8
utf8_estonian_ci 	utf8 	198 	  	Yes 	8
utf8_spanish_ci 	utf8 	199 	  	Yes 	8
utf8_swedish_ci 	utf8 	200 	  	Yes 	8
utf8_turkish_ci 	utf8 	201 	  	Yes 	8
utf8_czech_ci 	utf8 	202 	  	Yes 	8
utf8_danish_ci 	utf8 	203 	  	Yes 	8
utf8_lithuanian_ci 	utf8 	204 	  	Yes 	8
utf8_slovak_ci 	utf8 	205 	  	Yes 	8
utf8_spanish2_ci 	utf8 	206 	  	Yes 	8
utf8_roman_ci 	utf8 	207 	  	Yes 	8
utf8_persian_ci 	utf8 	208 	  	Yes 	8
utf8_esperanto_ci 	utf8 	209 	  	Yes 	8
utf8_hungarian_ci 	utf8 	210 	  	Yes 	8
 
Сверху