Сортировка не поддается Collation

4m@t!c

Александр
Сортировка не поддается Collation

Есть база. которая хранится в в latin1.
Версия Мускула 4.1.3
Ось - Windows XP SP1.
Делаю запрос
PHP:
SELECT *  FROM cities ORDER BY convert ( _latin1 'cityname' USING cp1251 ) COLLATE cp1251_bin
Сортируется неверно
Делаю
PHP:
SELECT *  FROM cities ORDER BY CAST(_latin1 'cityname' AS CHAR CHARACTER SET cp1251) COLLATE cp1251_bin
Таже мама.
Подскажите, пожалуйста, где я туплю и где мне повылазило?
 

mani13

Новичок
что за извращения?
про SET NAMES не слышал?
подключаешься, меняешь кодировку, выполняешь запрос, и неважно в чём база хранится...
 

4m@t!c

Александр
Автор оригинала: mani13
что за извращения?
про SET NAMES не слышал?
подключаешься, меняешь кодировку, выполняешь запрос, и неважно в чём база хранится...
Зачем тогда две эти функции?????
Если я поменяю локаль, то вся информация будет тарабарщиной написана.
 

Апельсин

Оранжевое создание
> Версия Мускула 4.1.3

для начала было бы неплохо обновить версию, а потом задавать вопросы.
 

4m@t!c

Александр
Т.е. в 4.1.3 - глюки с кодировками? Поставить 4.1.9?

-~{}~ 24.03.05 15:00:

Точней 4.1.10a?
 

Апельсин

Оранжевое создание
вот поставьте и проверите заодно.

используя альфа-версию (или бета?) глупо надеяться что за вас здесь будут тестировать и проверять.
 

4m@t!c

Александр
На сайте сейчас 4.1.10а...(Буквы мне ни о чем не говорят)
Ща закачаю установлю и гляну.
Просто я ламака в программировании.. Думал, может, я что-то не так делаю и меня ткнут носом промеж строк Маны, которую я прочел уже раз десять за последние 3 часа. но запросы-то корректные? и колейшн появился с 4.1 тут же я не туплю?
 

Апельсин

Оранжевое создание
> но запросы-то корректные?

по идее CAST() и CONVERT() должны работать одинаково.

> и колейшн появился с 4.1 тут же я не туплю?

да. нет.
 

4m@t!c

Александр
Проверил все на 4.1.9 - Не работает.
Что самое интересное, я работаую через MySQL Control Center, кликаю по заголовку полученной таблицы - все честно сортируется. Выходит - у меня запросы неправильно составлены.
Я запросом вытягиваю данные из таблицы, что бы их упорядочить в русском алфавите - конвертирую из latin1 в cp1251. что не так? где грабли?

-~{}~ 24.03.05 17:12:

Буду признателен. если кто-то растолкует мне-дураку, почему работает вот это?

SELECT * FROM `cities` ORDER BY cityname COLLATE latin1_bin

Код:
show variables;
+---------------------------------+--------------------------+
| Variable_name                   | Value                    |
+---------------------------------+--------------------------+
| character_set_client            | latin1                   |
| character_set_connection        | latin1                   |
| character_set_database          | latin1                   |
| character_set_results           | latin1                   |
| character_set_server            | latin1                   |
| character_set_system            | utf8                     |
| character_sets_dir              | c:\mysql\share\charsets/ |
| collation_connection            | latin1_swedish_ci        |
| collation_database              | latin1_swedish_ci        |
| collation_server                | latin1_swedish_ci        |
+---------------------------------+--------------------------+

CREATE TABLE `cities` (
  `cityid` int(10) unsigned NOT NULL auto_increment,
  `cityname` char(20) NOT NULL default '',
  `countryid` char(100) NOT NULL default '',
  PRIMARY KEY  (`cityid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-~{}~ 24.03.05 17:35:

В мане написано
10.3.10 BINARY Operator

The BINARY operator is a shorthand for a COLLATE clause. BINARY 'x' is equivalent to 'x' COLLATE y, where y is the name of the binary collation for the character set of 'x'. Every character set has a binary collation. For example, the binary collation for the latin1 character set is latin1_bin, so if the column a is of character set latin1, the following two statements have the same effect:

SELECT * FROM t1 ORDER BY BINARY a;
SELECT * FROM t1 ORDER BY a COLLATE latin1_bin;
Прошу объясните, пожалуйста, на пальцах, как для тех, кто только что вылез из танка.
 

Апельсин

Оранжевое создание
> я работаую через MySQL Control Center, кликаю по заголовку полученной таблицы - все честно сортируется.

MyCC старый клиент, который уже не поддерживается.
запустите сервер с general query log и посмотрите какие запросы MyCC шлет при сортировке.
 

AnToXa

prodigy-одаренный ребенок
вик, ты просто бесподобна :)
респект

З.Ы. сорри за офф
 

4m@t!c

Александр
Я знаю, что он не поддерживается. И есть альтернативы MySQL Query Browser и MySQL Administrator.
Я не могу понять, почему не отработали первые два запроса? И почему работает двоичный вариант?
>запустите сервер с general query log и посмотрите какие запросы MyCC шлет при сортировке.
Не знаю, чем жто может помочь но вот
Код:
050325 10:40:15	     13 Query       SELECT * FROM cities ORDER BY cityname COLLATE latin1_bin ASC
		     13 Query       EXPLAIN SELECT * FROM cities ORDER BY cityname COLLATE latin1_bin ASC
		     13 Query       SHOW FIELDS FROM `cities`
 

Апельсин

Оранжевое создание
> И есть альтернативы MySQL Query Browser

Он вам вряд ли подойдет. Там соединение открывается каждый раз при выполнении запроса, кроме случаев когда открывается транзакция или если запросы выполняются из скрипта.
А при старте там кодировку установить нельзя, с которой должно открываться соединение.

> И почему работает двоичный вариант?
потому что такой collation :) он кстати будет работать только для cp1251, а для koi8 уже нет.

ну в MyCC они тоже бинарный collation используют.

-~{}~ 25.03.05 11:57:

AnToXa, не полизывайся!
 

4m@t!c

Александр
>потому что такой collation он кстати будет работать только для cp1251, а для koi8 уже нет.
:)))) Так все объяснили, аж ничего не понятно... спасибо за соучаствие.
 

Апельсин

Оранжевое создание
> Так все объяснили, аж ничего не понятно...

ну можете посмотреть коды для обоих character set и collation - это будет более детальная демонстрация почему так проиходит, тем не менее я сомневаюсь что более доходчивая.
 

4m@t!c

Александр
Я не могу понять, причем здесь графическая оболочка к запросам. Почему первые запросы выполнились некорректно, а двоичный корректно? Есть characterset, есть collation.
Как я понимаю - collation - это правило, по которому происходит сортировка подобные манипуляции. Выходит, что collation - это часть characterset???? И когда я пишу двоичный collation, то упорядочивание идет по номеру в таблицы символов? Т.е. если бы Русский алфавит в таблице символов кодировки latin1 был непопорядку, а хаотично - у меня бы ничего не получилось?
Тогда опять возникает вопрос. почему некорректно отрабатывают запросы:
SELECT * FROM cities ORDER BY convert ( _latin1 'cityname' USING cp1251 ) COLLATE cp1251_bin
и
SELECT * FROM cities ORDER BY CAST(_latin1 'cityname' AS CHAR CHARACTER SET cp1251) COLLATE cp1251_bin
 

Апельсин

Оранжевое создание
> не могу понять, причем здесь графическая оболочка к запросам.

оболочка не при чем :) просто в MyCC используется latin_bin что и дает вам "корректный" результат.

> Почему первые запросы выполнились некорректно, а двоичный корректно?

потому что такова специфика работы latin_bin с cp1251. В версиях до 4.1 использовали ключевое слово BINARY что бы обойти latin1 на сервере для корректной сортировки. Но повторяю это специфика исключительно cp1251 & latin1_bin и не более того.

> Выходит, что collation - это часть characterset????
нет.
character set - это то каким макаром представляются у тебя символы. collation - это то каким макаром коды сравниваются.

> И когда я пишу двоичный collation, то упорядочивание идет по номеру в таблицы символов?

да

> Т.е. если бы Русский алфавит в таблице символов кодировки latin1 был непопорядку, а хаотично - у меня бы ничего не получилось?

да

> Тогда опять возникает вопрос. почему некорректно отрабатывают запросы

то что они выдают у вас разные результаты - это смахивает на баг, имхо, но баги сабмитяться на bugs.mysql.com, а не здесь :)
 

4m@t!c

Александр
Спасибо...
З.Ы. жаль, что не знаю английский.... Я бы обязательно написал за эту проблему разработчикам...
 

Апельсин

Оранжевое создание
> жаль, что не знаю английский...

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