Новости
Документация
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



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.


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

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

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



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