Значение параметра из TUIBQuery усекается при обратном чтении для Database.Charset=csUTF8

Я работаю над приложением, созданным в Delphi 2010, которое использует UIB для подключения к базе данных Firebird 2.5. Приложение работает с использованием набора символов по умолчанию в течение длительного времени, то есть никто не задумывался над набором символов, и оно просто работало. В настоящее время я пытаюсь заставить его работать правильно с данными UTF-8.

При этом я столкнулся с проблемой с TUIBQuery и параметризованными запросами. Когда используешь Database.Charset=csUTF8 и устанавливают значение параметра для поля CHAR(n) и извлекают его перед выполнением запроса, значение усекается.

К сожалению, некоторые из моих кодов записывают и читают такие параметры во многих местах и ​​поэтому умирают безобразно.

Чтобы изолировать и продемонстрировать проблему, я создал простую свежую базу данных с DEFAULT CHARACTER SET UTF-8 и такой стол:

  CREATE TABLE TEST (
    CHARFIELD CHAR(20),
    VARCHARFIELD VARCHAR(20)
  );

Я настроил приложение для подключения к базе данных, используя TUIBDatabase и TUIBTransaction. Затем я создал экземпляр TUIBQuery, установил для SQL параметризованный оператор INSERT в эту таблицу и установил параметры:

  Query := TUIBQuery.Create(NIL);
  Query.Transaction := Transaction;
  Query.SQL.Text := 'INSERT INTO TEST (CHARFIELD, VARCHARFIELD) VALUES (:CHARFIELD, :VARCHARFIELD)';
  Query.Prepare(True);

  s:= 'ABC';

  Query.Params.ByNameAsString['CHARFIELD'] := s;
  Query.Params.ByNameAsString['VARCHARFIELD'] := s;

Когда я сейчас читаю значения параметров обратно так:

  s := Query.Params.ByNameAsString['CHARFIELD'];
  s := Query.Params.ByNameAsString['VARCHARFIELD'];

Результаты верны для Database.Charset=csNone, Но когда я вместо этого укажу DataBase.Charset=csUTF8 значение для CHARFIELD усекается до 'A' вместо 'ABC', Значение для VARCHARFIELD в порядке. Поведение не зависит от фактических данных, мне не нужно фактически использовать не-ASCII-символы, чтобы спровоцировать их, как показано в примере.

Вызов ExecSQL() для запроса работает правильно и вставляет данные, как и ожидалось в обоих случаях.

Я загрузил исходный код в мою простую тестовую программу как http://www.qvwx.de/tmp/UIB_UTF8_Test.zip.

Кто-нибудь здесь имеет представление о том, что я могу делать неправильно и как сделать это правильно?

0 ответов

Другие вопросы по тегам