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

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

Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

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

Сообщение 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)
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

При создании БД какая кодировка базы была задана?
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Сообщение Zhbr »

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

utf8
Забыл указать: Lazarus 1.2.6 Linux
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Zhbr »

Попробовал через параметры, ситуация аналогичная.
Аватара пользователя
Xenar
постоялец
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Сообщение Xenar »

Когда я в очередной столкнулся с подобным я плюнул и поставил Zeos.
Более проблем не имею.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Zhbr
Может надо указать кодировку клиентской части. Не знаю как MySQL - в FB именно и надо делать.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

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

Действительно, можно попробовать самым первым запросом (до того, как начали получать какие-либо данные) задать клиентскую кодировку для текущего соединения:

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

MySQLConnection.ExecuteDirect('SET CHARACTER SET utf8');
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Сообщение Zhbr »

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

Сообщение GAMER »

set names utf8
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Сообщение Zhbr »

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

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

Действительно, можно попробовать самым первым запросом (до того, как начали получать какие-либо данные) задать клиентскую кодировку для текущего соединения:

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

MySQLConnection.ExecuteDirect('SET CHARACTER SET utf8');


Да действительно если указывать кодировку так то все нормально, проблемы нет. Но тогда MySQLConnection.CharSet для чего нужна? Я думал она выполняет аналогичную функцию. Или я не правльно понимаю.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

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

Сообщение Zhbr »

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


Это все понятно, что должна совпадать. В том то и дело, она совпадает. Причем на одном компе кодировка кривая передается, а на другом, код такой же, кодировка в норме (оба на ядре linux), мускул находися на удаленном сервере. Вот сейчас пытаюсь понять почему так. Причем судя из описания TSQLConnection.CharSet делает именно это.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение 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;
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

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

Нужно использовать

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

SQLQuery.ParamByName
SQLQuery.insert

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

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

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