Мы используем двоичное значение, которое хранится в таблицах как CHAR(18) CHARACTER SET OCTETS.
В Firebird 2.0.4 мы использовали ASCII как набор символов базы данных по умолчанию, так и набор символов соединения. У нас есть UDF, который может генерировать необходимые данные, которые определяются как:
DECLARE EXTERNAL FUNCTION CREATEBINARY
RETURNS CSTRING(76)
ENTRY_POINT 'CREATEBINARY'
MODULE_NAME 'CustomUDF';
Получение значения с помощью
SELECT CREATEBINARY() FROM RDB$DATABASE
возвращает ожидаемое значение.
В Firebird 2.5.2 мы используем UTF8 как в качестве набора символов базы данных по умолчанию, так и в качестве набора символов соединения. Попытка вызвать нашу UDF с помощью приведенного выше оператора select теперь приводит к ошибке:
Context: Statement::Fetch
Message: idx_dsql_fetch failed.
SQL Message: -104
Invalid Token
Engine Code: 335544849
Engine Message:
Malformed string
Я попытался изменить объявление функции, чтобы указать набор символов результата как OCTETS и NONE:
DECLARE EXTERNAL FUNCTION CREATEBINARY
RETURNS CSTRING(76) CHARACTER SET OCTETS
ENTRY_POINT 'CREATEBINARY'
MODULE_NAME 'CustomUDF';
но я все еще получаю тот же результат ошибки.
Я протестировал это в FlameRobin 0.9.3.1870 и в нашем приложении, используя Delphi XE2 Update 4 и IBObjects 4.9 Release 14. Оба терпят неудачу одинаково.