SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.03.2008 09:07:13

sqlinfontranс
Участник
Зарегистрирован: 26.03.2008
Сообщений: 1

Кодировки клиента-mysql (win98) и сервера

Объясните, происходит ли перекодировка между данными, которые вводит клиет в консольной или терминальной сессии и хранимыми данными на сервере MySQL?

Версия  для win32 - 5.0.51.
---
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.51     |
+-----------+

В секции [mysqld] файла конфигурации никаких default-character-set, skip-character-set-client-handshake. Т.е база создается с характеристиками:
default-character-set=latin1
default-collation=latin1_swedish_ci

Выполняю следующую последовательность (набрал в редакторе, который поддерживает кодировки cp866, cp1251 и koi8-r)

--- (Начало)Это текстовая копия экрана из сеанса MS-DOS ---
Microsoft(R) Windows 98
   (C)Copyright Microsoft Corp 1981-1999.

D:\SQL>type d
drop table if exists t;
CREATE TABLE t (
  name char(40)  NOT NULL
);

insert into t (name) values ('Dos cp866  Кодировка');
insert into t (name) values ('Win cp1251 -юфшЁютър');
insert into t (name) values ('NIX koi8r  ы--+--+--');
select * from t;
--- (Конец)

Использовал функцию копирование из экрана MS-DOS и конечно реальные символы для кодировок cp1251 и koi8r отличаются от приведенных выше. Но везде последнее слово в строке "Кодировка"

Далее выполняю этот скрипт в mysql, получаю:
mysql> \. d
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.06 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.05 sec)
Query OK, 1 row affected (0.00 sec)
+----------------------+
| name                 |
+----------------------+
| Dos cp866  ?R¤ЁаRўЄ_ |
| Win cp1251 Кодировка |
| NIX koi8r  лПДЙТПЧЛБ |
+----------------------+
3 rows in set (0.00 sec)

Далее выполняю:

mysql> insert into t values ('НОВАЯ запись');
Query OK, 1 row affected (0.11 sec)

mysql> select * from t;
+----------------------+
| name                 |
+----------------------+
| Dos cp866  ?R¤ЁаRўЄ_ |
| Win cp1251 Кодировка |
| NIX koi8r  лПДЙТПЧЛБ |
| ??'?? §_ЇЁбм         |
+----------------------+
4 rows in set (0.22 sec)

Просматриваю таблицу `t.MYD` hex-вьювером, и - первая и четвертая записи в кодировке cp866, вторая - cp1251, третья - koi8-r.

Здесь результат выполнения такой команды:

mysql> show variables like 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | latin1                         |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | latin1                         |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.33 sec)

Пробовал менять в секции [mysqld] и [client]
default-character-set=[cp1251|cp866]
default-collation=[cp1251|cp866]_general_ci
character_set_client=[cp866|cp1251]
После смены default-character-set перезапускал сервер, выполнял команды "DROP DATABASE test; CREATE DATABASE test"
Плюс все это же с наличием/отсутстваем skip-character-set-client-handshake и с обязательным перезапуском mysqld, а также с выполнением первой командой клиентом "SET NAMES cp1251|cp866" и т.д. - и НИЧЕГО! Все это опробовано под учетной записью root и специально созданным пользователем - test с ограниченными правами.
Так все происходит ли преобразование кодировок?
И последнее NIX'ий клиент правильно показывает третью запись с кодировкой koi8r и при добавлении новой записи в koi8r правильно ее же отображает от любого пользователя!!!
Но очень нужно использовать клиента MySQL именно для win98

Неактивен

 

#2 26.03.2008 10:23:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Кодировки клиента-mysql (win98) и сервера

Таблица в той кодировке, которая в ее описании, смотрите SHOW CREATE TABLE test;
Если у Вас таблица в latin1, то русские буквы могут в ней сохраниться, но только по случайности. Определитесь, в какой русской кодировке хотите, чтобы данные хранились на сервере (это не очень важно, так как перекодировка происходит). Пусть koi8r
CREATE TABLE test (.....) CHARSET=koi8r;

Далее, Вам необходимо понять в какой кодировке живет клиент mysql в виндоусе, вероятно в cp866. В таком случае первой командой Вам надо сообщить MySQL, что вы вводите все в cp866.
SET NAMES cp866;
Далее просто делайте INSERT и русские буквы, MySQL перекодирует их из cp866 в koi8r и положит в таблицу, а при SELECT наоборот.
Смотрите статью: http://sqlinfo.ru/articles/info/2.html

Неактивен

 

#3 26.03.2008 11:09:35

ntranc
Участник
Зарегистрирован: 26.03.2008
Сообщений: 4

Re: Кодировки клиента-mysql (win98) и сервера

Извините за повторную регистрацию, первый раз что-то прошло не так :-(

Итак перезапускаю сервер.
в my.cnf следующие строки:
[client]
# default-character-set=cp1251
default-character-set=cp866
[mysqld]
default-character-set=cp1251

Скрипт `d` изменен следующим образом:
drop table if exists t;
CREATE TABLE t (
  name char(40)  NOT NULL
) default charset cp1251;

insert into t (name) values ('Dos cp866  Љ®¤Ёа®ўЄ ');
insert into t (name) values ('Win cp1251 Кодировка');
insert into t (name) values ('NIX koi8r  лПДЙТПЧЛБ');
show create table t\G
select * from t;

Результат выполнения скрипта и последующих команд insert/select:
mysql> \. d
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)

*************************** 1. row **************
       Table: t
Create Table: CREATE TABLE `t` (
  `name` char(40) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
1 row in set (0.06 sec)

+----------------------+
| name                 |
+----------------------+
| Dos cp866  ?R¤ЁаRўЄ_ |
| Win cp1251 Кодировка |
| NIX koi8r  лПДЙТПЧЛБ |
+----------------------+
3 rows in set (0.05 sec)

mysql> insert into t values ('Новая строка');
Query OK, 1 row affected (0.11 sec)

mysql> select * from t;
+----------------------+
| name                 |
+----------------------+
| Dos cp866  ?R¤ЁаRўЄ_ |
| Win cp1251 Кодировка |
| NIX koi8r  лПДЙТПЧЛБ |
| ?Rў_п бваRЄ_         |
+----------------------+
4 rows in set (0.06 sec)

Неактивен

 

#4 26.03.2008 11:17:57

ntranc
Участник
Зарегистрирован: 26.03.2008
Сообщений: 4

Re: Кодировки клиента-mysql (win98) и сервера

И еще пробую первой командой выполнить `set names` - результат хуже :-(

----
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.0.51 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> set names cp866;
Query OK, 0 rows affected (0.11 sec)

mysql> show variables like 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | cp866                          |
| character_set_connection | cp866                          |
| character_set_database   | latin1                         |
| character_set_filesystem | binary                         |
| character_set_results    | cp866                          |
| character_set_server     | cp1251                         |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.06 sec)
mysql> \. d
Query OK, 0 rows affected (0.11 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.22 sec)
Query OK, 1 row affected, 1 warning (0.00 sec)
Query OK, 1 row affected, 1 warning (0.00 sec)

*************************** 1. row ***********
       Table: t
Create Table: CREATE TABLE `t` (
  `name` char(40) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
1 row in set (0.11 sec)

+----------------------+
| name                 |
+----------------------+
| Dos cp866  ?R¤ЁаRўЄ_ |
| Win cp1251 ?одировка |
| NIX koi8r  л???????? |
+----------------------+
3 rows in set (0.05 sec)

Неактивен

 

#5 26.03.2008 11:39:51

ntranc
Участник
Зарегистрирован: 26.03.2008
Сообщений: 4

Re: Кодировки клиента-mysql (win98) и сервера

Похоже просто проблемы mysql-клиента от win98 :-(
В линуксе следующие команды к данной таблице отработали на ура:

set names koi8r;
insert into t values ('Новая строка');
select * from t;

И win-клиент, после отработки этих команд в линуксе, отвечает:
Последняя строка заносилась линуксовым клиентом...

mysql> select * from t;
+----------------------+
| name                 |
+----------------------+
| Dos cp866  ?R¤ЁаRўЄ_ |
| Win cp1251 Кодировка |
| NIX koi8r  лПДЙТПЧЛБ |
| ?Rў_п бваRЄ_         |
| Новая строка         |
+----------------------+
5 rows in set (0.61 sec)

Неактивен

 

#6 26.03.2008 11:43:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Кодировки клиента-mysql (win98) и сервера

Возможно в винде в консоли нужно SET NAMES cp1251

Неактивен

 

#7 26.03.2008 12:17:58

ntranc
Участник
Зарегистрирован: 26.03.2008
Сообщений: 4

Re: Кодировки клиента-mysql (win98) и сервера

Это было опробовано еще до первого сообщения.
И похоже, проблема в кривой win98, хотя вроде лицензионная second edition и т.д и т.п.
Дело в том, что команда chcp в сеансе MS-DOS для win98 выдает следующий результат и менять кодовую страницу не дает:

---
C:\>chcp
Активная кодовая страница: 437
C:\>chcp 866
Кодовая страница 866 для системы не подготовлена

Неактивен

 

#8 27.03.2008 17:27:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Кодировки клиента-mysql (win98) и сервера

Именно поэтому в Windows рекомендуют использовать GUI Tools - потому что
правильно использовать консоль очень тяжело.

Под win2k/xp у меня работал cp866. В win98 не тестировал никогда sad

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson