Страница 1 из 2

Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 03:07:47
Zhbr
Проблема такая, при выполнении sql запроса русско-язычные символы передаются на сервер БД с неверной кодировкой к примеру:


Код: Выделить всё
Query.SQL.Add('INSERT INTO '+m_base+'.product (product_name, product_id) VALUES ('''+temp1^.product_name+''', '''+IntToStr(temp1^.product_id)+''');');
  Query.ExecSQL;\0

где temp1^.product_name спарсенная строка из xml (UTF8)

Если при подключении к бд не задавать кодировку (TMySQL55Connection.Charset) то в бд будет записанна cp1252. Одним слово кракозябры. Как так?
Если указать UTF8 то просто знаки вопроса.
Есть идеи как это победить?

Для парсинга xml использую utf8 версию модуля xmlread (laz2_xmlread)

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 04:48:26
Vadim
При создании БД какая кодировка базы была задана?

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 07:21:50
Zhbr
Vadim писал(а):При создании БД какая кодировка базы была задана?

utf8
Забыл указать: Lazarus 1.2.6 Linux

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 07:42:03
sign
Попробуйте через параметры.

Код: Выделить всё
  Query.SQL.Add(Format('INSERT INTO %s.product(product_name, product_id) VALUES (:product_name, :product_id);', [m_base]);
  Query.SQL.ParamByName(product_name).AsString := temp1^.product_name;
  Query.SQL.ParamByName(product_id).AsLargeInt := temp1^.product_id;
  Query.ExecSQL;

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 08:26:21
Zhbr
Попробовал через параметры, ситуация аналогичная.

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 08:32:37
Xenar
Когда я в очередной столкнулся с подобным я плюнул и поставил Zeos.
Более проблем не имею.

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 10:27:42
alexs
Zhbr
Может надо указать кодировку клиентской части. Не знаю как MySQL - в FB именно и надо делать.

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 10:42:42
Vadim
Zhbr
Ещё вопрос: какая у Вас версия FreePascal?

alexs писал(а):Может надо указать кодировку клиентской части.

Действительно, можно попробовать самым первым запросом (до того, как начали получать какие-либо данные) задать клиентскую кодировку для текущего соединения:
Код: Выделить всё
MySQLConnection.ExecuteDirect('SET CHARACTER SET utf8');

Re: Проблема с кодировкой

СообщениеДобавлено: 16.04.2015 21:32:44
Zhbr
Очень странно, но на домашнем компе такой проблемы не наблюдаю, хотя версия компилятора и лазаруса одинаковая. Может дело в версии клиентских библиотек mysql.
Короче на убунте кодировка тупит, а на арче норм. Надо будет поисследовать.

Re: Проблема с кодировкой

СообщениеДобавлено: 19.04.2015 00:08:52
GAMER
set names utf8

Re: Проблема с кодировкой

СообщениеДобавлено: 19.04.2015 09:37:46
Zhbr
Vadim писал(а):Zhbr
Ещё вопрос: какая у Вас версия FreePascal?

alexs писал(а):Может надо указать кодировку клиентской части.

Действительно, можно попробовать самым первым запросом (до того, как начали получать какие-либо данные) задать клиентскую кодировку для текущего соединения:
Код: Выделить всё
MySQLConnection.ExecuteDirect('SET CHARACTER SET utf8');


Да действительно если указывать кодировку так то все нормально, проблемы нет. Но тогда MySQLConnection.CharSet для чего нужна? Я думал она выполняет аналогичную функцию. Или я не правльно понимаю.

Re: Проблема с кодировкой

СообщениеДобавлено: 19.04.2015 17:57:15
debi12345
БД-кодировка должна совпадать с кодировкой в запросах. Если БД закодирована в UTF8, то на клиенте нужно перекодировать в UFT8. Или если БД поддрживает настроечные команды (PG: SET CLIENT_ENCODING TO 'cp1251', MySQL: SET NAMES = 'cp1251'), то выполнить их как SQL-команды сразу после установки соединения.

Re: Проблема с кодировкой

СообщениеДобавлено: 19.04.2015 20:23:15
Zhbr
debi12345 писал(а):БД-кодировка должна совпадать с кодировкой в запросах. Если БД закодирована в UTF8, то на клиенте нужно перекодировать в UFT8. Или если БД поддрживает настроечные команды (PG: SET CLIENT_ENCODING TO 'cp1251', MySQL: SET NAMES = 'cp1251'), то выполнить их как SQL-команды сразу после установки соединения.


Это все понятно, что должна совпадать. В том то и дело, она совпадает. Причем на одном компе кодировка кривая передается, а на другом, код такой же, кодировка в норме (оба на ядре linux), мускул находися на удаленном сервере. Вот сейчас пытаюсь понять почему так. Причем судя из описания TSQLConnection.CharSet делает именно это.

Re: Проблема с кодировкой

СообщениеДобавлено: 19.04.2015 20:28:14
GAMER
Не уверен, что должна совпадать.
Для того, чтобы мускуль-сервер знал как общаться с клиентом (ну и сортировать там по ходу), и используются команды типа set names utf8.

Добавлено спустя 13 минут:
Запрос SET NAMES ‘charset_name’ [COLLATE ‘collation_name’]

Параметр определяет в какой кодировке теперь будут приходить сообщения для сервера от клиента. Прелесть в том, что запрос SET NAMES x эквивалентен следующей группе:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Re: Проблема с кодировкой

СообщениеДобавлено: 19.04.2015 21:44:05
Ism
Во первых с записями так, как в первом посте, не работают

Нужно использовать
Код: Выделить всё
SQLQuery.ParamByName
SQLQuery.insert

ExecSQL вообще для этого не предназначен

2 В случае проблем с кодировкой нужно пробовать передавать cp1251 или utf8

3 Таблица в базе должна быть UTF8