Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
cmd.exe + mysql.exe = только cp1251? (Foxtrot) 11/01/2009 - 20:12:23
      Re: cmd.exe + mysql.exe = только cp1251? (Foxtrot) 11/01/2009 - 21:14:06
      Re: cmd.exe + mysql.exe = только cp1251? (txm) 02/04/2009 - 22:41:17

> Original message text:
> From: Foxtrot - 11/01/2009 - 20:12:23
> Subject:cmd.exe + mysql.exe = только cp1251?
> -----------------
> Добрый день,
> в процессе освоения Мускула последние 3 дня исключительно тестю грабли с кодировками в консоли. Несмотря на все обещания (это про посты по всему И-нету о chcp, set names, шрифт Lucida Console и т.д.) mysql.exe в консоле винды упроно корректно выдает данные только в кодировке винды (cp1251) не зависимо от настройки консоли и переменных типа '...charset...', а также натройки полей таблиц.
>
> Это у всех так? или это только мое колесо (изобретение)?
>
> По моим наблюдениям склоняюсь к тому, что все портит mysql.exe.
> Ниже пошагово мои действия и выводы:
>
> сервак 5.1.30 устанавливался (на моей тестовой машине) с дефолтной кодировкой koi8r (чисто потестить), база MyDB создавалась с дефолтной кодировкой. В настройках окна консоли выбран шрифт Lucida Console (хотя выяснилось, что на отображение запроса это не влияет). Поведение идентичное в Windows 2000 SP4 и в XP SP2.
>
> Теперь команды и реакция в консоли (кое-где подрезал):
>
> Y:\Program Files\MySQL\MySQL Server 5.1\bin>chcp 1251
> Текущая кодовая страница: 1251
>
> Y:\Program Files\MySQL\MySQL Server 5.1\bin>mysql -u root -p MyDB
> Enter password: *******
> Welcome to the MySQL monitor. Commands end with ; or \g.
> Your MySQL connection id is 10
> Server version: 5.1.30-community MySQL Community Server (GPL)
>
> mysql> set names cp1251;
> Query OK, 0 rows affected (0.00 sec)
>
> mysql> show variables like 'char%';
> [подтер псевдографику]
> character_set_client 1251
> character_set_connection cp1251
> character_set_database koi8r
> character_set_filesystem binary
> character_set_results cp1251
> character_set_server koi8r
> character_set_system utf8
> character_sets_dir Y:\Program Files\MySQL\MySQL Server 5.1\share\charsets\
>
> mysql> show create table t1;
> +-------+----------------------------------------------------
> | Table | Create Table
> +-------+----------------------------------------------------
> | t1 | CREATE TABLE `t1` (
> `f1_koi8r` varchar(50) DEFAULT NULL,
> `f2_cp1251` varchar(50) CHARACTER SET cp1251 DEFAULT NULL,
> `f3_cp866` varchar(50) CHARACTER SET cp866 DEFAULT NULL
> ) ENGINE=InnoDB DEFAULT CHARSET=koi8r |
> +-------+-----------------------------------------------------
> 1 row in set (0.00 sec)
>
> Добавляем запись в таблицу, в каждой ячейке - коды символов 'абвг' из соответствующих кодировок.
>
> mysql> insert into t1(f1_koi8r, f2_cp1251, f3_cp866) values(_koi8r 0xC1C2D7C7, _cp1251 0xE0E1E2E3, _cp866 0xA0A1A2A3);
> Query OK, 1 row affected (0.00 sec)
>
> Посмотрим, что получилось:
>
> mysql> select f1_koi8r, hex(f1_koi8r), f2_cp1251, hex(f2_cp1251), f3_cp866, hex(f3_cp866) from t1;
>
> +----------+---------------+-----------+----------------+----------+---------------+
> | f1_koi8r | hex(f1_koi8r) | f2_cp1251 | hex(f2_cp1251) | f3_cp866 | hex(f3_cp866) |
> +----------+---------------+-----------+----------------+----------+---------------+
> | абвг | C1C2D7C7 | абвг | E0E1E2E3 | абвг | A0A1A2A3 |
> +----------+---------------+-----------+----------------+----------+---------------+
> 1 row in set (0.00 sec)
>
> Как видно, все чудненько сохранилось и отобразилось при настройке на cp1251. Попробуем то же посмотреть в cp866 (стандартная для DOS).
>
> mysql> exit
> Bye
>
> Y:\Program Files\MySQL\MySQL Server 5.1\bin>chcp 866
> Текущая кодовая страница: 866
>
> Y:\Program Files\MySQL\MySQL Server 5.1\bin>mysql -u root -p MyDB
> Enter password: *******
>
> mysql> set names cp866;
> Query OK, 0 rows affected (0.00 sec)
>
> mysql> show variables like 'char%';
> +--------------------------+---------------------------------------------------------+
> | Variable_name | Value |
> +--------------------------+---------------------------------------------------------+
> | character_set_client | cp866 |
> | character_set_connection | cp866 |
> | character_set_database | koi8r |
> | character_set_filesystem | binary |
> | character_set_results | cp866 |
> | character_set_server | koi8r |
> | character_set_system | utf8 |
> | character_sets_dir | Y:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
> +--------------------------+---------------------------------------------------------+
> 8 rows in set (0.00 sec)
>
> mysql> select f1_koi8r, hex(f1_koi8r), f2_cp1251, hex(f2_cp1251), f3_cp866, hex(f3_cp866) from t1;
> +----------+---------------+-----------+----------------+----------+---------------+
> | f1_koi8r | hex(f1_koi8r) | f2_cp1251 | hex(f2_cp1251) | f3_cp866 | hex(f3_cp866) |
> +----------+---------------+-----------+----------------+----------+---------------+
> | Ўў? | C1C2D7C7 | Ўў? | E0E1E2E3 | Ўў? | A0A1A2A3 |
> +----------+---------------+-----------+----------------+----------+---------------+
> 1 row in set (0.00 sec)
>
> Как видно, байты в таблице те же, а отображаются в левой кодировке. Совершенно случайно строка ' Ўў?' соответствует кодам A0A1A2A3 в кодировке cp1251 (только вместо последнего ? должно быть что-то типа J), а коды A0A1A2A3 тоже случайно соответствуют строке 'абвг' в кодировке cp866.
>
> Что в итоге получается: сервак честно хранит в байтах полей символы соответственно их кодировке, честно конвертит результат запроса в cp866 (соответственно переменной character_set_results=cp866). По другую сторону, консоль честно настроена на досовскую кодировку (chcp 866) и шрифт Lucida Concole содержит необходимые начертания букв (а иначе были бы крукозябры вместо "Текущая кодовая страница: 866", как в растровых шрифтах). Получается что-то между сервером и окном консоли упорно конвертит результаты запроса в cp1251.
>
> Тестировал вышеприведенный порядок в кодировке консоли 20866 (koi8r), поведение идентично, тока вместо A0A1A2A3 (абвг в cp866), сервак выдает C1C2D7C7 (абвг в koi8r), что выводится консолью как БВЧЗ (соответствующие символы в cp1251).
>
> В чем может быть причина? mysql.exe? Такое впечатление, что для виндовой косоли сделали работу в cp1251 и решили, что этого хватит...
>
> P.S. по дефолту в my.ini везде стоит koi8r, хотя толку от него никакого, раз используется set names. Поведение идентично в cmd.exe и в консоли MySQL из меню программ.
>
> P.S.S. Для упрощения тестов использую иногда просто запрос вида select 0xE0E1E2E3 - если отображается 'абвг' значит для вывода используется cp1251.
>


From: Foxtrot - 11/01/2009 - 21:14:06
Subject:cmd.exe + mysql.exe = только cp1251?
-----------------
Ха, еще забавный глюк нашел: если в настройках ярлыка cmd.exe на вкладке 'параметры' поставить отображение во весь экран (чтобы эмулятор в полноэкранном режиме стартовал с загрузкой шрифтов непосредственно в видюху), то для корректного отображения результатов запроса нужно, чтобы в консоли было выполнено chcp 866, а в mysql.exe set names cp1251. Также корректно будет работать если наоборот в консоли chcp 1251, а в mysql.exe set names cp866 :)

Чес говоря, впечатление, что в mysql какая-то халтура во взаимодействии с консолью :)


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
35297



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |