Неявный реконект к MySQL.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Неявный реконект к MySQL.

Сообщение GAMER »

Работаю с MySQL 5.5.*. Заметил, что если был обрыв связи без смены ІР, то происходит "неявное" переподключение к серверу. Вроде бы и не плохо, но есть одна проблема. Не происходит выполнение "SET NAMES UTF8". И слетает кодировка. Работаю напрямую через LibMySQL.DLL. Как-то можно отловить такое переподключение?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

А вы в каждом запросе пишите:

Код: Выделить всё

SET NAMES UTF8;
SELECT ...
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Вариант хороший, но не оптимальный. Может я не знаю, но вроде нельзя несколько запросов в одном пакете отправлять.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Так SET NAMES не является запросом возвращающим данные.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Не спорю, но как отправить 2 запроса одновременно, последовательно, в одном пакете. Символ ";", насколько я понял, работает только в клиенте mysql.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

Query.SQL.Add('SET NAMES UTF8; SELECT ...')
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

TQuery не использую.
а mysql_query(MySock,'set names utf8; select ...') не работает так. Ведь он на каждый отдельный запрос дает свой ответ.
Конечно, можно разделять на отдельные запросы, но как-то не сильно хочется такое творить. Еще поковыряю саму libmysql
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

С нативной либой для MySQL не работал т.ч. сказать ничего не могу.
п.с. Если подумать - то вообще с MySQL не работал. Нет пока надобности...
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

unsigned long mysql_thread_id(MYSQL *mysql)
Описание

Возвращает идентификатор данного потока для текущего соединения. Эта величина может быть использована как аргумент для функции mysql_kill() для уничтожения данного потока.

Если соединение прерывается и осуществляется его восстановление с помощью функции mysql_ping(), то идентификатор данного потока изменится. Это означает, что нельзя получить идентификатор данного потока и хранить его для последующего использования. Следует определять его, когда в этом есть необходимость.

То есть, если идентификатор потока изменился, выполняем "set names utf8".
Но если его выполнять перед каждым запросом, то не вижу разницы с предыдущими вариантами. Разве, что не так накладно по расходам будет.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

GAMER
А если в клиентском конфиге сервера сразу установить UTF-8? Или Вы с разными кодировками работаете?
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Тоже думал над этим, но база, в принципе, может храниться на сервера, где эти настройки могут быть недоступными. Хотя, такой вариант более оптимален. Нужно попробовать хотя бы там, где это возможно.

Добавлено спустя 2 минуты 47 секунд:
Кроме того, есть софт, который может работать с тем же сервером, и для которого нужны свои (другие) клиентские настройки.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

GAMER
Хорошо. А если периодически проверять кодировку с помощью mysql_client_encoding()?
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

2 Vadim. Спасибо за совет, посмотрю.

В принципе, достаточно сделать проверку при записи данных, в другом случае пользователь сам увидит бред и перезапустит программу. :)
Ответить