Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> MySQL меняет кодировку после переподключения
Kreon
сообщение 22.11.2008 - 11:29

/dev/random
*******
отличительный знак Z*
Группа: Участник
Сообщений: 2216
Регистрация: 5.11.2006
Пользователь №: 16651


Есть MySQL 5.0.45.
После апгрейда на него длительное время не мог разобраться, почему периодически падает коннект к БД, что при запросах выводится "MySQL server has gone away". В итоге нашел такой параметр для mysql_options(), который нужно задавать перед непосредственно mysql_connect():
Цитата
MYSQL_OPT_RECONNECT (argument type: my_bool *)

Enable or disable automatic reconnection to the server if the connection is found to have been lost. Reconnect has been off by default since MySQL 5.0.3; this option is new in 5.0.13 and provides a way to set reconnection behavior explicitly.

Действительно, падать подключение перестало. Однако после восстановления связи весь текст на кириллице начинает выводиться в виде "????? ?? ????". Проверяю кодировку - и вижу, что вместо cp1251, с которой происходит коннект по умолчанию, выставлено latin1.
wtf?

Судя по описанию опции, действительно сбрасываются все временные настройки, например, выставленные через SET NAMES. Только у меня SET NAMES нигде не применяется. Как и переназначение кодировок после подключения в целом.
Поэтому и вопрос. Куда воткнуть этот SET NAMES, если с точки зрения программы никакого переподключения в целом не произошло и соединение не падало, т.к. оно восстанавливается автоматически и программа этого не замечает? Или как заставить реконнект не сбрасывать кодировку?
Перейти в начало страницы
 
+Цитировать сообщение
srv
сообщение 22.11.2008 - 17:06
Частый гость
***

Группа: Участник
Сообщений: 192
Регистрация: 30.10.2005
Пользователь №: 10364


Цитата(Kreon @ 22.11.2008 - 11:29) *
Куда воткнуть этот SET NAMES, если с точки зрения программы никакого переподключения в целом не произошло и соединение не падало, т.к. оно восстанавливается автоматически и программа этого не замечает? Или как заставить реконнект не сбрасывать кодировку?


Сразу же после коннекта:
Код
mysql_query("set names cp1251;");


Сообщение отредактировано srv - 22.11.2008 - 17:07
Перейти в начало страницы
 
+Цитировать сообщение
Kreon
сообщение 23.11.2008 - 10:48

/dev/random
*******
отличительный знак Z*
Группа: Участник
Сообщений: 2216
Регистрация: 5.11.2006
Пользователь №: 16651


Я так понял из мануала, что выставленные после первого коннекта таким образом кодировки будут сброшены при автореконнекте.
А сразу же после автореконнекта отправить такой запрос из программы не получится, т.к. программа и не узнает о том, что автореконнект произошел.

Вбил в модуль работы с бд mysql_options(dbc, MYSQL_INIT_COMMAND, "set names cp1251"), жду следующего обрыва связи.
Цитата
MYSQL_INIT_COMMAND (argument type: char *)

Statement to execute when connecting to the MySQL server. Automatically re-executed if reconnection occurs.
Перейти в начало страницы
 
+Цитировать сообщение
Kreon
сообщение 25.11.2008 - 16:41

/dev/random
*******
отличительный знак Z*
Группа: Участник
Сообщений: 2216
Регистрация: 5.11.2006
Пользователь №: 16651


Не помогло.
Теперь неудивительно, почему по умолчанию переподключение к базам отключено. Настолько косячную реализацию уметь надо сделать, наверное.
Есть ещё какие-либо варианты?
Перейти в начало страницы
 
+Цитировать сообщение
srv
сообщение 25.11.2008 - 21:53
Частый гость
***

Группа: Участник
Сообщений: 192
Регистрация: 30.10.2005
Пользователь №: 10364


Цитата(Kreon @ 22.11.2008 - 11:29) *
Есть MySQL 5.0.45.
....
mysql_connect():
................


а на чем пишешь -то?

Может-поможетsmile.gif
9.1.5. Configuring the Character Set and Collation for Applications
]]>http://dev.mysql.com/doc/refman/5.0/en/cha...plications.html]]>

Сообщение отредактировано srv - 25.11.2008 - 22:03
Перейти в начало страницы
 
+Цитировать сообщение
Kreon
сообщение 30.11.2008 - 17:08

/dev/random
*******
отличительный знак Z*
Группа: Участник
Сообщений: 2216
Регистрация: 5.11.2006
Пользователь №: 16651


На Си. %)
Нашел, в общем, где-то описание аналогичного бага, где пользователь жалуется на то, что libmysqlclient при подключении не читает данные из my.cnf, не проверяет почти никакие параметры и использует по умолчанию всегда latin1. А остальное сообщество его уверяет, что так и должно быть. smile.gif

Последняя версия - вбил mysql_options(dbc,MYSQL_SET_CHARSET_NAME,"cp1251"); - вроде пока нормально.
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 19.04.2024 - 09:48