Новости
Документация
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: txm - 02/04/2009 - 22:41:17
Subject:cmd.exe + mysql.exe = только cp1251?
-----------------
У меня, честно говоря, больше претензий к Виндовозу. Думаю, что это их внутри системные преобразования. Я сейчас встал в ступор от того, как обмениваются символами VB6 и мускул. Помимо проблемм с изображением в консоли (когда подума, что все уже позади), напоролся на следующ. пень: сделал таблицу с полем в ср1251 и UTF8. В phpMyAdmine ввожу в оба поля русские слова. Селект тут же все красиво показывает. Открываю набор в басике -- кракозябы. Делаю инсерт записи в басике (из русских слов), в поле под ср1251 на сервере получаю в 16-ричном виде строку 3F3F3F.., т.е. ее както сломало напрочь. То что utf8, видно что, что написало. НО читается только кракозябой, нигде не открывает нормальное преобразование. Вот так то. Так что, тут больше проблемм в оси (я так думаю!!!!)


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

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

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



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