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

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

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

Вы не зашли.

#1 30.09.2009 09:48:40

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Проблема с кодировкой при работе через процедуру

У меня начинаются проблемы с кодировками, когда работаю через процедуру. Если используется кирилица, то все преобразуется в знаки вопроса - ?????????

сама процедура выглядит так:

DROP PROCEDURE IF EXISTS `InsertAdvertisement`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertAdvertisement`(
        IN in_uid INTEGER(10) UNSIGNED,
        IN in_tid INTEGER(10) UNSIGNED,
        IN in_nid INTEGER(10) UNSIGNED,
        IN in_vid INTEGER(10) UNSIGNED,
        IN in_duration INTEGER(10) UNSIGNED
    )
    MODIFIES SQL DATA
BEGIN
    DECLARE l_created INT(10) unsigned;
    DECLARE l_stateid INT(5) unsigned;
    DECLARE l_state VARCHAR(255);
    DECLARE l_driverid INT(5) unsigned;
    DECLARE l_driver VARCHAR(255);
    DECLARE l_body LONGTEXT;
    DECLARE l_title VARCHAR(255);
   
    select n.created, nr.body, nr.title into l_created, l_body, l_title from node n, `node_revisions` nr where n.nid = in_nid and n.nid = nr.`nid` AND nr.vid = in_vid;
    select nstateid, nstate, did, driver into l_stateid, l_state, l_driverid, l_driver from wf_transitions where nstate = 'published' and wf_name = 'advertisement workflow';
       
    START TRANSACTION;
        INSERT INTO advertisement(tid, vid, nid) VALUE (in_tid, in_vid, in_nid);
    INSERT INTO `advr_history`(uid, nid, vid, title, body) VALUE (in_uid, in_nid, in_vid,l_title, l_body);
      INSERT INTO wf_nodes(nid,sid,tcreated,tfinished) VALUE (in_nid,l_stateid,l_created,l_created + in_duration);
    INSERT INTO wf_nodes_history(nid, state, driver, time, reason) VALUE (in_nid, l_state, l_driver, l_created, NULL);
    COMMIT;
   
END$$

Если делать то же самое, но через SQL запросы, то все ок...
Версия MySQL 5.1.36

Объясните в чем тут проблема и как ее решить?

Заранее благодарен,
Siegfrid

Отредактированно Siegfrid (30.09.2009 10:31:38)

Неактивен

 

#2 30.09.2009 10:35:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Проблема с кодировкой при работе через процедуру

Какая версия MySQL?

Покажите результат

SHOW VARIABLES LIKE 'character_set%';

Неактивен

 

#3 30.09.2009 10:43:28

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

Re: Проблема с кодировкой при работе через процедуру

Также обратите внимание на кодировки, в которых создаются процедуры:

mysql> select * from information_schema.routines\G
*************************** 1. row ***************************
       SPECIFIC_NAME: te
     ROUTINE_CATALOG: NULL
      ROUTINE_SCHEMA: test
        ROUTINE_NAME: te
        ROUTINE_TYPE: PROCEDURE
      DTD_IDENTIFIER: NULL
        ROUTINE_BODY: SQL
  ROUTINE_DEFINITION: insert u values(z)
       EXTERNAL_NAME: NULL
   EXTERNAL_LANGUAGE: NULL
     PARAMETER_STYLE: SQL
    IS_DETERMINISTIC: NO
     SQL_DATA_ACCESS: CONTAINS SQL
            SQL_PATH: NULL
       SECURITY_TYPE: DEFINER
             CREATED: 2009-09-02 21:21:27
        LAST_ALTERED: 2009-09-02 21:21:27
            SQL_MODE:
     ROUTINE_COMMENT:
             DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
  DATABASE_COLLATION: latin1_swedish_ci

1 row in set (0.01 sec)

Неактивен

 

#4 30.09.2009 11:57:07

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Вот вывод:

+--------------------------+-----------------------------------------------+
| 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:\wamp\bin\mysql\mysql5.1.36\share\charsets\ |
+--------------------------+-----------------------------------------------+

я так понимаю. мне н.б. поменять latin на utf8?
А для какого набора кодировок?

Отредактированно Siegfrid (30.09.2009 11:58:04)

Неактивен

 

#5 30.09.2009 12:00:07

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

ROUTINE_COMMENT:
             DEFINER: root@localhost
CHARACTER_SET_CLIENT: latin1
COLLATION_CONNECTION: latin1_swedish_ci
  DATABASE_COLLATION: latin1_swedish_ci

Опять же, везде латиница, так мне ее поменять на utf8?

Неактивен

 

#6 30.09.2009 12:34:46

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

Re: Проблема с кодировкой при работе через процедуру

set names utf8, пересоздать процедуру

Неактивен

 

#7 30.09.2009 12:50:57

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

paulus написал:

set names utf8, пересоздать процедуру

не помогло sad

теперь стало
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
  DATABASE_COLLATION: latin1_swedish_ci

Но все равно вместо русских букв вопросы...

Отредактированно Siegfrid (30.09.2009 12:55:06)

Неактивен

 

#8 30.09.2009 12:59:34

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Я уже и на кирилицу поменял переменные, все равно фигня какая то...
mysql> SHOW GLOBAL VARIABLES LIKE 'character_set%';
+--------------------------+---------------------------------------------+
| Variable_name            | Value                                       |
+--------------------------+---------------------------------------------+
| character_set_client     | cp1251                                      |
| character_set_connection | cp1251                                      |
| character_set_database   | cp1251                                      |
| character_set_filesystem | binary                                      |
| character_set_results    | cp1251                                      |
| character_set_server     | cp1251                                      |
| character_set_system     | utf8                                        |
| character_sets_dir       | c:\wamin\mysql\mysql5.1.36 hare\charsets\ |
+--------------------------+---------------------------------------------+
8 rows in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'character_set%';
+--------------------------+---------------------------------------------+
| Variable_name            | Value                                       |
+--------------------------+---------------------------------------------+
| character_set_client     | utf8                                        |
| character_set_connection | utf8                                        |
| character_set_database   | latin1                                      |
| character_set_filesystem | binary                                      |
| character_set_results    | utf8                                        |
| character_set_server     | cp1251                                      |
| character_set_system     | utf8                                        |
| character_sets_dir       | c:\wamin\mysql\mysql5.1.36 hare\charsets\ |
+--------------------------+---------------------------------------------+
8 rows in set (0.00 sec)

Неактивен

 

#9 30.09.2009 13:10:37

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Меня немного смущает путь к файлам с кодировкой: c:\wamin\mysql\mysql5.1.36 hare\charsets\ - припопытке выставить его в нормальный, интерпретатор отказывается реагировать на ввод ";" :

mysql> SET SESSION  character_sets_dir="c:\wamp\bin\mysql\mysql5.1.36\share\charsets\";
    ">
    ">

Неактивен

 

#10 30.09.2009 14:08:01

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

С путями к кодировкам разобрался, но проблема все равно осталась!

mysql> SHOW SESSION VARIABLES LIKE 'character%';
+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | cp1251                                        |
| character_set_connection | cp1251                                        |
| character_set_database   | cp1251                                        |
| character_set_filesystem | binary                                        |
| character_set_results    | cp1251                                        |
| character_set_server     | cp1251                                        |
| character_set_system     | utf8                                          |
| character_sets_dir       | c:\wamp\bin\mysql\mysql5.1.36\share\charsets\ |
+--------------------------+-----------------------------------------------+
8 rows in set (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'character%';
+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | cp1251                                        |
| character_set_connection | cp1251                                        |
| character_set_database   | cp1251                                        |
| character_set_filesystem | binary                                        |
| character_set_results    | cp1251                                        |
| character_set_server     | cp1251                                        |
| character_set_system     | utf8                                          |
| character_sets_dir       | c:\wamp\bin\mysql\mysql5.1.36\share\charsets\ |
+--------------------------+-----------------------------------------------+
8 rows in set (0.00 sec)

Неактивен

 

#11 30.09.2009 14:30:50

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Я так понимаю, что судя по сему проблема кроется тут:
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: latin1_swedish_ci <- вот это место никак не удается сменить на UTF8....

Неактивен

 

#12 30.09.2009 15:07:54

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Я так понимаю, проблема в том, что в таблице collationы нет ни одной строки ни с UTF8 ни с CP1251... если их доьавить руками, ничего криминального не случиться?

Неактивен

 

#13 30.09.2009 15:39:59

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

Re: Проблема с кодировкой при работе через процедуру

Зависит от того, считаете ли Вы добавление строк криминальным wink

А вообще, скорее всего, у Вас все таблицы в latin1 и туда тупо не сохраняются русские буквы.

Неактивен

 

#14 30.09.2009 16:05:51

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

нет, в том то и дело, что все таблицы изначально в UTF8, я даже менял кодировку на cp1251, все равно ничерта не помогло...

Неактивен

 

#15 30.09.2009 16:52:46

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

Re: Проблема с кодировкой при работе через процедуру

Ну подсоединитесь клиентом с известной кодировкой (для консоли виндоус
это cp866, вроде бы), скажите SET NAMES <кодировка>, вставьте русские
строки в табличку, сделайте SELECT из этого же клиента, убедитесь, что они
русские, вызовите процедуру из этого же клиента, убедитесь, что все хорошо.

Неактивен

 

#16 30.09.2009 17:54:33

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

paulus написал:

Ну подсоединитесь клиентом с известной кодировкой (для консоли виндоус
это cp866, вроде бы), скажите SET NAMES <кодировка>, вставьте русские
строки в табличку, сделайте SELECT из этого же клиента, убедитесь, что они
русские, вызовите процедуру из этого же клиента, убедитесь, что все хорошо.

Вот листинг, из него видно, что при прямом обращении все ок...:

mysql> SET NAMES cp1251
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> use testdb6;
Database changed
mysql> INSERT INTO `advr_history`(uid, nid, vid, title, body) VALUE (1, 123, 123,'тест через консоль', 'тест через консоль body');
Query OK, 1 row affected (0.06 sec)

mysql> select * from advr_history where uid = 1;
+-----+-----+-----+-----+--------------------+-------------------------+
| hid | uid | nid | vid | title              | body                    |
+-----+-----+-----+-----+--------------------+-------------------------+
|  24 |   1 | 102 | 103 | ???? 4 tets 4      | <p>???? 4 tets 4</p>    |
|  25 |   1 | 103 | 104 | ???? 4 tets 4      | <p>???? 4 tets 4</p>    |
|  26 |   1 | 104 | 105 | ???? 4 tets 4      | <p>???? 4 tets 4</p>    |
|  27 |   1 | 105 | 106 | ???? 4 tets 4      | <p>???? 4 tets 4</p>    |
|  28 |   1 | 123 | 123 | тест через консоль | тест через консоль body |
+-----+-----+-----+-----+--------------------+-------------------------+
5 rows in set (0.00 sec)

Решил проверить, саму выборку из таблицы, и тут меня ждал сюрприз:
mysql> select n.created, nr.body, nr.title from node n, `node_revisions` nr where n.nid = nr.nid and n.type = 'advertisement';
+------------+-----------------------------------------------------------------------------------------------------------------
                                 | ЄхёЄ 4 tets 4                |
| 1254313818 | <p>ЄхёЄ 4 tets 4</p>
                                 | ЄхёЄ 4 tets 4                |
| 1254316621 | <p>ЄхёЄ 4 tets 4</p>
                                 | ЄхёЄ 4 tets 4                |
| 1254317621 | <p>ЄхёЄ 4 tets 4</p>
                                 | ЄхёЄ 4 tets 4                |

Видать изначально есть конфликт перекодировки при выборке из таблицы node_revisions:

CREATE TABLE `node_revisions` (
  `nid` int(10) unsigned NOT NULL DEFAULT '0',
  `vid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL DEFAULT '0',
  `title` varchar(255) NOT NULL DEFAULT '',
  `body` longtext NOT NULL,
  `teaser` longtext NOT NULL,
  `log` longtext NOT NULL,
  `timestamp` int(11) NOT NULL DEFAULT '0',
  `format` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`vid`),
  KEY `nid` (`nid`),
  KEY `uid` (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=1528;

CREATE TABLE `node` (
  `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vid` int(10) unsigned NOT NULL DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '',
  `language` varchar(12) NOT NULL DEFAULT '',
  `title` varchar(255) NOT NULL DEFAULT '',
  `uid` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `created` int(11) NOT NULL DEFAULT '0',
  `changed` int(11) NOT NULL DEFAULT '0',
  `comment` int(11) NOT NULL DEFAULT '0',
  `promote` int(11) NOT NULL DEFAULT '0',
  `moderate` int(11) NOT NULL DEFAULT '0',
  `sticky` int(11) NOT NULL DEFAULT '0',
  `tnid` int(10) unsigned NOT NULL DEFAULT '0',
  `translate` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`nid`),
  UNIQUE KEY `vid` (`vid`),
  KEY `node_changed` (`changed`),
  KEY `node_created` (`created`),
  KEY `node_moderate` (`moderate`),
  KEY `node_promote_status` (`promote`,`status`),
  KEY `node_status_type` (`status`,`type`,`nid`),
  KEY `node_title_type` (`title`,`type`(4)),
  KEY `node_type` (`type`(4)),
  KEY `uid` (`uid`),
  KEY `tnid` (`tnid`),
  KEY `translate` (`translate`)
) ENGINE=MyISAM AUTO_INCREMENT=106 DEFAULT CHARSET=utf8;

У нее установлена по умолчанию кодировка utf8 и при этом если делать запрос через браузер, то все отражается корректно...
В общем я окончательно запутался...

Отредактированно Siegfrid (30.09.2009 18:09:53)

Неактивен

 

#17 30.09.2009 18:14:52

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

Re: Проблема с кодировкой при работе через процедуру

Вы уверены, что консоль у Вас работает в 1251? В виндоус консоль по умолчанию
работает в cp866. Со стороны веб-сервера нужно делать тоже SET NAMES — в ту
кодировку, которая уезжает в браузер.

Неактивен

 

#18 30.09.2009 18:27:20

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

paulus написал:

Вы уверены, что консоль у Вас работает в 1251? В виндоус консоль по умолчанию
работает в cp866. Со стороны веб-сервера нужно делать тоже SET NAMES — в ту
кодировку, которая уезжает в браузер.

вроде как поменял на 1251:
C:\>chcp 1251
Active code page: 1251


теперь действительно, отображаются лишь одни ????
mysql> use testdb6
Database changed
mysql> select n.created, nr.body, nr.title from node n, `node_revisions` nr where n.nid = nr.nid and n.type = 'advertisement';
--------------------------------------------------------------------------------------------------------------------------------------------------
                                 | ???? 5                       |
| 1254312341 | <p>???? 5</p>
                                 | ???? 5                       |
| 1254312764 | <p>???? 5</p>
                                 | ???? 5                       |
| 1254313333 | <p>???? 4 tets 4</p>
                                 | ???? 4 tets 4                |
| 1254313818 | <p>???? 4 tets 4</p>
                                 | ???? 4 tets 4                |
| 1254316621 | <p>???? 4 tets 4</p>
                                 | ???? 4 tets 4                |
| 1254317621 | <p>???? 4 tets 4</p>
                                 | ???? 4 tets 4                |

Что с этим можно сделать?

Неактивен

 

#19 30.09.2009 18:49:06

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Поменял все на utf8 где можно, вместо вопросов теперь отражается белиберда, что уже получше, но вот что меня убивает, так это почему в проводниках через php все отображается нормально (за исключением того, что обрабатывается процедурой...)?

Неактивен

 

#20 30.09.2009 19:12:12

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

Вопрос решен!
оказывается у меня по умолчанию была выбрана схема кодировки не просто utf, а utf у которой DATABASE_COLLATION = latin1_swedish_ci, это и мешало нормально отображать данные!

Неактивен

 

#21 30.09.2009 19:49:30

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

Re: Проблема с кодировкой при работе через процедуру

Ух тыы, команду chcp надо запомнить smile Я всегда думал, что в виндоус кодировка
консоли прибита гвоздиками.

И замечательно, что Вы разобрались smile

Неактивен

 

#22 01.10.2009 13:30:58

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

paulus написал:

Ух тыы, команду chcp надо запомнить smile Я всегда думал, что в виндоус кодировка
консоли прибита гвоздиками.

И замечательно, что Вы разобрались smile

В тему:
Смена кодировки на UTF8 в windows - chcp 65001
сами коды кодировки брать тут -> http://msdn.microsoft.com/en-us/library … 85%29.aspx

Неактивен

 

#23 01.10.2009 13:33:47

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Проблема с кодировкой при работе через процедуру

только забавно, что в mysql это не сильно помогло, все равно символы отражались абракадаброй, хот я уже и не вопросами! Видимо тут уже дело связано с виндозными шрифтами... так что я не стал париться, а напрпямую начал пробовал через html

Неактивен

 

#24 01.10.2009 14:54:31

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

Re: Проблема с кодировкой при работе через процедуру

Последний раз консолью виндоус я пользовался года три назад, и вряд ли когда-либо буду
пользоваться ей в принципе, но сам факт того, что она умеет это делать, — приятен smile

P.S. Попробуйте поставить тогда в консоли какой-нибудь нестандартный шрифт — может, будет
показывать нормально?

P.P.S. MySQL GUI Tools никто не отменял, они не привязаны к консоли, поэтому хорошо
работают в UTF8.

Неактивен

 

Board footer

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