Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток, уважаемые.
Вот собственно запрос:
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; - порядок тот же.
Подскажите, как привести порядок к алфавитному. Заранее спасибо.
Неактивен
Странно. А вы выполняете запрос в пхпадмине? Если да, то причина может быть в этом. Попробуйте выполнить в консоли.
Неактивен
это из консоли результат
Неактивен
Давайте по порядку.
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 пунктом сделать дамп.
Неактивен
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)немного информации потерялось - видимо длину поля маленькую выбрал
а порядок остался таким, как и в 3 пункте
Неактивен
Какое сопоставление попросили — такое и получили. utf8_bin — это бинарное
сопоставление. Если посмотрите, как бинарно кодируются русские буквы в utf8,
станет понятно, почему так (они как раз посередине алфавита добавляют новый
байт).
Если данные не большие — сдампите их, уберите все явные вхождения сопоставлений
(оставьте дефолтное general_ci, оно хорошее), после чего загрузите дамп.
Неактивен
убил все данные, вставил просто рандомных слов кучу... порядок не изменился
вообще создал таблицу с 1-м полем
| test | CREATE TABLE `test` (`name` varchar(10) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
забил просто алфавит туда... порядок тот же
Отредактированно COTOHA (08.04.2010 16:42:44)
Неактивен
Проблема в двух вещах:
1. Вы меня не поняли.
2. Вы не сделали то, что я попросил.
Нужно сделать следующее: удалить лишние метаданные (потому что они у Вас плохие).
Все таблицы при SHOW CREATE TABLE не должны показывать COLLATION — он должен
быть по умолчанию. После этого нужно сделать в локальном клиенте SET NAMES utf8
(у Вас стоит latin1). После этого в этом же клиенте (не переключаясь) надо залить данные.
И тогда всё будет хорошо.
Кстати, воспроизвести Вашу ситуацию я смог, дело не в utf8_bin, а в latin1, но первое
тоже надо полечить
--
UPD:
Аха, отредактировали. Первое сделали, надо сделать второе
Неактивен
спасибо!!! все заработало как надо
про SET NAMES я даже и не знал, но теперь разобрался
спасибо!!!
UPD: только теперь почему-то в пхп стал ?????? выдавать
UPD: сообразил! только теперь надо поменять collation_connection, character_set_client... ну и т.д.
как это сделать, чтобы каждый раз при реконнекте не выполнять SET NAMES?
Отредактированно COTOHA (09.04.2010 09:51:17)
Неактивен
В пхп тоже надо делать SET NAMES, разумеется (который и ставит все эти
переменные, только одной удобной командой).
Неактивен