Значение параметра из 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.
Кто-нибудь здесь имеет представление о том, что я могу делать неправильно и как сделать это правильно?