SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.04.2010 12:07:25

COTOHA
Участник
Зарегистрирован: 08.04.2010
Сообщений: 5

Проблема с ORDER в utf-8

Доброго времени суток, уважаемые.

Вот собственно запрос:
SELECT units.id AS unit, units.name AS name, sum(incomes.value) AS value, units.measure AS measure FROM units INNER JOIN incomes ON units.id=incomes.unit GROUP BY name ORDER BY name ASC;

В результате порядок получается таким:
а б в г д е ж з и й к л м н о п с э я ь ъ ю у ш ё т ф ц ч х щ ы р

Collation utf8_bin, тип поля 'name' - VARCHAR.
Пробовал менять тип поля на TEXT - порядок не меняется.
collation на general_ci и unicode_ci - порядок становится еще более непохожим на алфавитный.
Думал, может в запросе проблема, попробовал просто SELECT * FROM units ORDER BY name ASC; - порядок тот же.

Подскажите, как привести порядок к алфавитному. Заранее спасибо.

Неактивен

 

#2 08.04.2010 13:11:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Проблема с ORDER в utf-8

Странно. А вы выполняете запрос в пхпадмине? Если да, то причина может быть в этом. Попробуйте выполнить в консоли.

Неактивен

 

#3 08.04.2010 13:31:32

COTOHA
Участник
Зарегистрирован: 08.04.2010
Сообщений: 5

Re: Проблема с ORDER в utf-8

это из консоли результат sad

Неактивен

 

#4 08.04.2010 13:45:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Проблема с ORDER в utf-8

Давайте по порядку.
1) select version();
2) show create table units;
3) каков порядок если делать select name from units order by name collate utf8_general_ci;
4) попробуйте сделать alter table units modify name varbinary(x);
alter table units modify name varchar(x) charset utf8 collate utf8_general_ci;

P.S. Не забудьте перед 4 пунктом сделать дамп.

Неактивен

 

#5 08.04.2010 14:06:24

COTOHA
Участник
Зарегистрирован: 08.04.2010
Сообщений: 5

Re: Проблема с ORDER в utf-8

vasya написал:

Давайте по порядку.
1) select version();
2) show create table units;
3) каков порядок если делать select name from units order by name collate utf8_general_ci;
4) попробуйте сделать alter table units modify name varbinary(x);
alter table units modify name varchar(x) charset utf8 collate utf8_general_ci;

P.S. Не забудьте перед 4 пунктом сделать дамп.

1) 5.0.51a
2)| units | CREATE TABLE `units` (`id` int(11) NOT NULL auto_increment, `name` varchar(30) collate utf8_bin NOT NULL, `measure` varchar(10) collate utf8_bin NOT NULL, PRIMARY KEY  (`id`)) ENGINE=MyISAM AUTO_INCREMENT=67 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
3)ъ ю с э я ь у ш ё т ф ц ч х щ ы р а б в г д ж з и й к л м н о п е
4)немного информации потерялось - видимо длину поля маленькую выбралsmile
   а порядок остался таким, как и в 3 пункте sad

Неактивен

 

#6 08.04.2010 15:53:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ORDER в utf-8

Какое сопоставление попросили — такое и получили. utf8_bin — это бинарное
сопоставление. Если посмотрите, как бинарно кодируются русские буквы в utf8,
станет понятно, почему так (они как раз посередине алфавита добавляют новый
байт).

Если данные не большие — сдампите их, уберите все явные вхождения сопоставлений
(оставьте дефолтное general_ci, оно хорошее), после чего загрузите дамп.

Неактивен

 

#7 08.04.2010 16:28:14

COTOHA
Участник
Зарегистрирован: 08.04.2010
Сообщений: 5

Re: Проблема с ORDER в utf-8

убил все данные, вставил просто рандомных слов кучу... порядок не изменился
вообще создал таблицу с 1-м полем
| test  | CREATE TABLE `test` (`name` varchar(10) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
забил просто алфавит туда... порядок тот же sad

Отредактированно COTOHA (08.04.2010 16:42:44)

Неактивен

 

#8 08.04.2010 16:57:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ORDER в utf-8

Проблема в двух вещах:
1. Вы меня не поняли.
2. Вы не сделали то, что я попросил.

Нужно сделать следующее: удалить лишние метаданные (потому что они у Вас плохие).
Все таблицы при SHOW CREATE TABLE не должны показывать COLLATION — он должен
быть по умолчанию. После этого нужно сделать в локальном клиенте SET NAMES utf8
(у Вас стоит latin1). После этого в этом же клиенте (не переключаясь) надо залить данные.
И тогда всё будет хорошо.

Кстати, воспроизвести Вашу ситуацию я смог, дело не в utf8_bin, а в latin1, но первое
тоже надо полечить smile

--

UPD:
Аха, отредактировали. Первое сделали, надо сделать второе smile

Неактивен

 

#9 09.04.2010 09:03:24

COTOHA
Участник
Зарегистрирован: 08.04.2010
Сообщений: 5

Re: Проблема с ORDER в utf-8

спасибо!!! все заработало как надоsmile
про SET NAMES я даже и не знал, но теперь разобралсяsmile
спасибо!!!

UPD: только теперь почему-то в пхп стал ?????? выдаватьsmile

UPD: сообразил! только теперь надо поменять collation_connection, character_set_client... ну и т.д.
        как это сделать, чтобы каждый раз при реконнекте не выполнять SET NAMES?

Отредактированно COTOHA (09.04.2010 09:51:17)

Неактивен

 

#10 09.04.2010 12:26:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с ORDER в utf-8

В пхп тоже надо делать SET NAMES, разумеется (который и ставит все эти
переменные, только одной удобной командой).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson