Страница 1 из 2
Проблема с кодировкой
Добавлено: 16.04.2015 02: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 03:48:26
Vadim
При создании БД какая кодировка базы была задана?
Re: Проблема с кодировкой
Добавлено: 16.04.2015 06:21:50
Zhbr
Vadim писал(а):При создании БД какая кодировка базы была задана?
utf8
Забыл указать: Lazarus 1.2.6 Linux
Re: Проблема с кодировкой
Добавлено: 16.04.2015 06: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 07:26:21
Zhbr
Попробовал через параметры, ситуация аналогичная.
Re: Проблема с кодировкой
Добавлено: 16.04.2015 07:32:37
Xenar
Когда я в очередной столкнулся с подобным я плюнул и поставил Zeos.
Более проблем не имею.
Re: Проблема с кодировкой
Добавлено: 16.04.2015 09:27:42
alexs
Zhbr
Может надо указать кодировку клиентской части. Не знаю как MySQL - в FB именно и надо делать.
Re: Проблема с кодировкой
Добавлено: 16.04.2015 09:42:42
Vadim
ZhbrЕщё вопрос: какая у Вас версия FreePascal?
alexs писал(а):Может надо указать кодировку клиентской части.
Действительно, можно попробовать самым первым запросом (до того, как начали получать какие-либо данные) задать клиентскую кодировку для текущего соединения:
Код: Выделить всё
MySQLConnection.ExecuteDirect('SET CHARACTER SET utf8');
Re: Проблема с кодировкой
Добавлено: 16.04.2015 20:32:44
Zhbr
Очень странно, но на домашнем компе такой проблемы не наблюдаю, хотя версия компилятора и лазаруса одинаковая. Может дело в версии клиентских библиотек mysql.
Короче на убунте кодировка тупит, а на арче норм. Надо будет поисследовать.
Re: Проблема с кодировкой
Добавлено: 18.04.2015 23:08:52
GAMER
set names utf8
Re: Проблема с кодировкой
Добавлено: 19.04.2015 08:37:46
Zhbr
Vadim писал(а):ZhbrЕщё вопрос: какая у Вас версия FreePascal?
alexs писал(а):Может надо указать кодировку клиентской части.
Действительно, можно попробовать самым первым запросом (до того, как начали получать какие-либо данные) задать клиентскую кодировку для текущего соединения:
Код: Выделить всё
MySQLConnection.ExecuteDirect('SET CHARACTER SET utf8');
Да действительно если указывать кодировку так то все нормально, проблемы нет. Но тогда MySQLConnection.CharSet для чего нужна? Я думал она выполняет аналогичную функцию. Или я не правльно понимаю.
Re: Проблема с кодировкой
Добавлено: 19.04.2015 16:57:15
debi12345
БД-кодировка должна совпадать с кодировкой в запросах. Если БД закодирована в UTF8, то на клиенте нужно перекодировать в UFT8. Или если БД поддрживает настроечные команды (PG: SET CLIENT_ENCODING TO 'cp1251', MySQL: SET NAMES = 'cp1251'), то выполнить их как SQL-команды сразу после установки соединения.
Re: Проблема с кодировкой
Добавлено: 19.04.2015 19:23:15
Zhbr
debi12345 писал(а):БД-кодировка должна совпадать с кодировкой в запросах. Если БД закодирована в UTF8, то на клиенте нужно перекодировать в UFT8. Или если БД поддрживает настроечные команды (PG: SET CLIENT_ENCODING TO 'cp1251', MySQL: SET NAMES = 'cp1251'), то выполнить их как SQL-команды сразу после установки соединения.
Это все понятно, что должна совпадать. В том то и дело, она совпадает. Причем на одном компе кодировка кривая передается, а на другом, код такой же, кодировка в норме (оба на ядре linux), мускул находися на удаленном сервере. Вот сейчас пытаюсь понять почему так. Причем судя из описания TSQLConnection.CharSet делает именно это.
Re: Проблема с кодировкой
Добавлено: 19.04.2015 19:41: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 20:44:05
Ism
Во первых с записями так, как в первом посте, не работают
Нужно использовать
ExecSQL вообще для этого не предназначен
2 В случае проблем с кодировкой нужно пробовать передавать cp1251 или utf8
3 Таблица в базе должна быть UTF8