Баг в CONVERT`е ?

selinoth

Выполняю следующий код из файла (командой source):
SET NAMES cp866;
SELECT CONVERT( CAST( 'текст' AS BINARY) USING cp1251 );
SELECT CONVERT( 'текст' USING cp1251 );
Кодировка в файле cp1251. Первый запрос выдает читабельную строку "текст". Второй полную лажу. Вопрос: это ошибка в CONVERT`е или я что-то упустил ?
5 ответов

selinoth

А у меня всё наоборот:
mysql> SET NAMES cp866;
Query OK, <b>0</b> rows affected (<b>0</b>.<b>08</b> sec)

mysql> SELECT CONVERT( CAST( 'текст' AS BINARY) USING cp1251 );
+--------------------------------------------------+
| CONVERT( CAST( 'текст' AS BINARY) USING cp1251 ) |
+--------------------------------------------------+
| в?Єбв |
+--------------------------------------------------+
<b>1</b> row in set (<b>0</b>.<b>02</b> sec)

mysql> SELECT CONVERT( 'текст' USING cp1251 );
+---------------------------------+
| CONVERT( 'текст' USING cp1251 ) |
+---------------------------------+
| текст |
+---------------------------------+
<b>1</b> row in set (<b>0</b>.<b>02</b> sec)
Думаю надо разобраться, почему должно в обоих вариантах быть одинаково...
<b>.mahoune.</b>


selinoth

IMHO в кодировке клиента) у вас они разные.


selinoth

А у меня всё наоборот...
Вы, видимо, все из консоли делаете. Я же указанный код выполняю из файла с кодировкой CP1251. У вас в консоли кодировка CP866, поэтому второй выполняется правильно, а первый - конвертит из бинаря в CP866.


selinoth

У меня проблема на самом деле следующего характера: хранимая процедура генерирует текст, подставляя в результат некоторые символьные константы в кириллице. В зависимости от кодировки клиента она выполняется по-разному, поэтому константы приходится конвертировать. Но! Обычный convert без cast не работает - я не могу найти этому объяснение.


selinoth

Кодировка в файле cp1251. Первый запрос выдает читабельную строку "текст". Второй полную лажу. Вопрос: это ошибка в CONVERT`е или я что-то упустил ?
возможно, текст воспринимается в кодировке 866 (как указано первой командой) и такое восприятие текста закодированного в 1251 неверно, поэтому второй вариант выдаёт лажу. Откуда прога должна догадаться, что файл в 1251?