Неверная строка при вставке базы данных UTF8

Я использую компоненты Delphi 2010, Firebird 2.5.2, IBExpress.

Кодировка базы данных — UTF8. В db-подключении UTF8.

База данных:

var 
  Database: TIBDatabase;
begin
  ...
  Database.params.Clear;
  Database.params.Add('user ''SYSDBA'' password ''masterkey'' ');
  Database.params.Add('page_size 16384');
  Database.params.Add('default character set UTF8');

Таблица:

CREATE TABLE NEW_TABLE (
    NEW_FIELD  VARCHAR(255)
);

код подключения:

  Database.params.Clear;
  Database.params.Add('user_name=SYSDBA');
  Database.params.Add('password=masterke');
  Database.params.Add('sql_role_name=UTF8');
  Database.Open;

Код вставки:

var
  IBSQL: TIBSQL;
begin
  IBSQL := TIBSQL.Create(nil);
  try
    IBSQL.Database := db;
    IBSQL.Transaction := tr

    IBSQL.SQL.Text := 'insert into NEW_TABLE (NEW_FIELD) values (:param)';

    IBSQL.params[0].Value := 'Ãabc©'; // unsupported symbols :(

    if not IBSQL.Transaction.Active then
      IBSQL.Transaction.StartTransaction;

    IBSQL.ExecQuery; // "Malformed string" exception here

    if IBSQL.Transaction.Active then
      IBSQL.Transaction.Commit;
  finally
    FreeAndNil(IBSQL);
  end;
end;

Я получаю исключение «Неверная строка». Как вставить эту строку?


person barbaris    schedule 30.05.2013    source источник
comment
СОЗДАТЬ ТАБЛИЦУ NEW_TABLE (NEW_FIELD NVARCHAR(255)); ?   -  person bummi    schedule 30.05.2013
comment
@бамми: нет. firebirdsql.su/doku.php?id=tipy_dannyx&s[]=varchar Хм... я бы не стал использовать IBX с FB... Что-то не так, либо база данных не в UTF-8 (может быть, например, Unicode_FSS), либо соединение не в UTF-8, либо ошибка в IBX для D2010 ( кто знает, поддерживает ли он UTF-8?). Требуется больше исходного кода.   -  person Arioch 'The    schedule 30.05.2013
comment
UTF8 должен прекрасно поддерживать эти символы, поэтому сначала я бы проверил определение поля (используя isql или frlamerobin или любой другой инструмент, который вы используете), действительно ли это UTF8. Если это так, то я предполагаю, что это IBX несовместим с FB, переключитесь на какой-либо другой набор компонентов.   -  person ain    schedule 30.05.2013
comment
@ain он мог бы создать это поле в кодировке NONE, а затем переключить базу данных на UTF8 и подумать, что он также изменил таблицу. Я бы посмотрел на поле с помощью инструмента IBExpert. Не знаю, покажет ли FlameRobin унаследованную по умолчанию кодировку...   -  person Arioch 'The    schedule 30.05.2013
comment
Оффтоп: хорошая библиотека, чтобы срезать углы с FB+IBX: loginovprojects.ru/index. php?page=ibxfbutils#ibxfbutils   -  person Arioch 'The    schedule 30.05.2013
comment
Извините моя ошибка. Я установил ROLE вместо lc_ctype   -  person barbaris    schedule 30.05.2013
comment
Тем не менее, fb.InsertRecord(fdb, nil, 'TESTTABLE', ['ID', 'NAME', 'SUMMA'], [1, 'FIREBIRD - FOREVER', 100500]); выглядит проще, чем весь этот фрагмент :-)   -  person Arioch 'The    schedule 30.05.2013
comment
@barbaris Вы также можете добавить это как ответ на свой вопрос; может сделать его более заметным, чем комментарий   -  person Mark Rotteveel    schedule 31.05.2013


Ответы (1)


Убедитесь, что кодировка вашего поля — UTF-8.

При создании нового поля у вас есть два варианта:

  1. Создайте домен с кодировкой по умолчанию, сопоставьте и установите поле с доменом.
  2. Создайте поле без домена, задайте кодировку и сопоставьте вручную.

На изображении ниже показано поле, созданное с доменом с помощью IBExpert.

IBExpert с доменом и кодировкой

person lampada    schedule 08.11.2013