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

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

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

Сообщение Zhbr » 16.04.2015 03:07:47

Проблема такая, при выполнении 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)
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

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

Сообщение Vadim » 16.04.2015 04:48:26

При создании БД какая кодировка базы была задана?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение Zhbr » 16.04.2015 07:21:50

Vadim писал(а):При создании БД какая кодировка базы была задана?

utf8
Забыл указать: Lazarus 1.2.6 Linux
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

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

Сообщение sign » 16.04.2015 07:42:03

Попробуйте через параметры.

Код: Выделить всё
  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;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Zhbr » 16.04.2015 08:26:21

Попробовал через параметры, ситуация аналогичная.
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

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

Сообщение Xenar » 16.04.2015 08:32:37

Когда я в очередной столкнулся с подобным я плюнул и поставил Zeos.
Более проблем не имею.
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

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

Сообщение alexs » 16.04.2015 10:27:42

Zhbr
Может надо указать кодировку клиентской части. Не знаю как MySQL - в FB именно и надо делать.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение Vadim » 16.04.2015 10:42:42

Zhbr
Ещё вопрос: какая у Вас версия FreePascal?

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

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

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

Сообщение Zhbr » 16.04.2015 21:32:44

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

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

Сообщение GAMER » 19.04.2015 00:08:52

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

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

Сообщение Zhbr » 19.04.2015 09:37:46

Vadim писал(а):Zhbr
Ещё вопрос: какая у Вас версия FreePascal?

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

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


Да действительно если указывать кодировку так то все нормально, проблемы нет. Но тогда MySQLConnection.CharSet для чего нужна? Я думал она выполняет аналогичную функцию. Или я не правльно понимаю.
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

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

Сообщение debi12345 » 19.04.2015 17:57:15

БД-кодировка должна совпадать с кодировкой в запросах. Если БД закодирована в UTF8, то на клиенте нужно перекодировать в UFT8. Или если БД поддрживает настроечные команды (PG: SET CLIENT_ENCODING TO 'cp1251', MySQL: SET NAMES = 'cp1251'), то выполнить их как SQL-команды сразу после установки соединения.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение Zhbr » 19.04.2015 20:23:15

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


Это все понятно, что должна совпадать. В том то и дело, она совпадает. Причем на одном компе кодировка кривая передается, а на другом, код такой же, кодировка в норме (оба на ядре linux), мускул находися на удаленном сервере. Вот сейчас пытаюсь понять почему так. Причем судя из описания TSQLConnection.CharSet делает именно это.
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

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

Сообщение GAMER » 19.04.2015 20:28:14

Не уверен, что должна совпадать.
Для того, чтобы мускуль-сервер знал как общаться с клиентом (ну и сортировать там по ходу), и используются команды типа 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;
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

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

Сообщение Ism » 19.04.2015 21:44:05

Во первых с записями так, как в первом посте, не работают

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

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

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

3 Таблица в базе должна быть UTF8
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru