Задавайте вопросы, мы ответим
Вы не зашли.
У меня начинаются проблемы с кодировками, когда работаю через процедуру. Если используется кирилица, то все преобразуется в знаки вопроса - ?????????
сама процедура выглядит так:
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)
Неактивен
Какая версия MySQL?
Покажите результат
Неактивен
Также обратите внимание на кодировки, в которых создаются процедуры:
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)
Неактивен
Вот вывод:
+--------------------------+-----------------------------------------------+
| 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)
Неактивен
ROUTINE_COMMENT:
DEFINER: root@localhost
CHARACTER_SET_CLIENT: latin1
COLLATION_CONNECTION: latin1_swedish_ci
DATABASE_COLLATION: latin1_swedish_ci
Опять же, везде латиница, так мне ее поменять на utf8?
Неактивен
set names utf8, пересоздать процедуру
Неактивен
paulus написал:
set names utf8, пересоздать процедуру
не помогло
теперь стало
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: latin1_swedish_ci
Но все равно вместо русских букв вопросы...
Отредактированно Siegfrid (30.09.2009 12:55:06)
Неактивен
Я уже и на кирилицу поменял переменные, все равно фигня какая то...
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)
Неактивен
Меня немного смущает путь к файлам с кодировкой: c:\wamin\mysql\mysql5.1.36 hare\charsets\ - припопытке выставить его в нормальный, интерпретатор отказывается реагировать на ввод ";" :
mysql> SET SESSION character_sets_dir="c:\wamp\bin\mysql\mysql5.1.36\share\charsets\";
">
">
Неактивен
С путями к кодировкам разобрался, но проблема все равно осталась!
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)
Неактивен
Я так понимаю, что судя по сему проблема кроется тут:
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: latin1_swedish_ci <- вот это место никак не удается сменить на UTF8....
Неактивен
Я так понимаю, проблема в том, что в таблице collationы нет ни одной строки ни с UTF8 ни с CP1251... если их доьавить руками, ничего криминального не случиться?
Неактивен
Зависит от того, считаете ли Вы добавление строк криминальным
А вообще, скорее всего, у Вас все таблицы в latin1 и туда тупо не сохраняются русские буквы.
Неактивен
нет, в том то и дело, что все таблицы изначально в UTF8, я даже менял кодировку на cp1251, все равно ничерта не помогло...
Неактивен
Ну подсоединитесь клиентом с известной кодировкой (для консоли виндоус
это cp866, вроде бы), скажите SET NAMES <кодировка>, вставьте русские
строки в табличку, сделайте SELECT из этого же клиента, убедитесь, что они
русские, вызовите процедуру из этого же клиента, убедитесь, что все хорошо.
Неактивен
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)
Неактивен
Вы уверены, что консоль у Вас работает в 1251? В виндоус консоль по умолчанию
работает в cp866. Со стороны веб-сервера нужно делать тоже SET NAMES — в ту
кодировку, которая уезжает в браузер.
Неактивен
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 |
Что с этим можно сделать?
Неактивен
Поменял все на utf8 где можно, вместо вопросов теперь отражается белиберда, что уже получше, но вот что меня убивает, так это почему в проводниках через php все отображается нормально (за исключением того, что обрабатывается процедурой...)?
Неактивен
Вопрос решен!
оказывается у меня по умолчанию была выбрана схема кодировки не просто utf, а utf у которой DATABASE_COLLATION = latin1_swedish_ci, это и мешало нормально отображать данные!
Неактивен
Ух тыы, команду chcp надо запомнить Я всегда думал, что в виндоус кодировка
консоли прибита гвоздиками.
И замечательно, что Вы разобрались
Неактивен
paulus написал:
Ух тыы, команду chcp надо запомнить Я всегда думал, что в виндоус кодировка
консоли прибита гвоздиками.
И замечательно, что Вы разобрались
В тему:
Смена кодировки на UTF8 в windows - chcp 65001
сами коды кодировки брать тут -> http://msdn.microsoft.com/en-us/library … 85%29.aspx
Неактивен
только забавно, что в mysql это не сильно помогло, все равно символы отражались абракадаброй, хот я уже и не вопросами! Видимо тут уже дело связано с виндозными шрифтами... так что я не стал париться, а напрпямую начал пробовал через html
Неактивен
Последний раз консолью виндоус я пользовался года три назад, и вряд ли когда-либо буду
пользоваться ей в принципе, но сам факт того, что она умеет это делать, — приятен
P.S. Попробуйте поставить тогда в консоли какой-нибудь нестандартный шрифт — может, будет
показывать нормально?
P.P.S. MySQL GUI Tools никто не отменял, они не привязаны к консоли, поэтому хорошо
работают в UTF8.
Неактивен