SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » RDB$ERROR и русский текст в EXECUTE STATEMENT
RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2715] Mon, 10 July 2023 02:22 Переход к следующему сообщению
CyberMax в настоящее время не в онлайне  CyberMax
Сообщений: 8
Зарегистрирован: June 2023
Junior Member
FB 4.0.2.2770. Подключение в кодировке WIN1251.

Выполняю запрос:
EXECUTE BLOCK
RETURNS (TEXT_EXCEPTION VARCHAR(1024))
AS
BEGIN
BEGIN
EXECUTE STATEMENT 'execute block as begin EXCEPTION EXC$CHECK_DATA ''there exception''; end';
END
WHEN ANY DO
BEGIN
:TEXT_EXCEPTION = RDB$ERROR(MESSAGE);
SUSPEND;
END
END

Получаю текст:
exception 2
EXC$CHECK_DATA
There exception
At block line: 1, col: 24
At block line: 6, col: 9

Меняем текст на русский:
EXECUTE BLOCK
RETURNS (TEXT_EXCEPTION VARCHAR(1024))
AS
BEGIN
BEGIN
EXECUTE STATEMENT 'execute block as begin EXCEPTION EXC$CHECK_DATA ''Здесь исключение''; end';
END
WHEN ANY DO
BEGIN
:TEXT_EXCEPTION = RDB$ERROR(MESSAGE);
SUSPEND;
END
END

Выполняем:
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets.
At block line: 10, col: 9.

С этим в трекер идти?
Re: RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2720 является ответом на сообщение #2715] Mon, 10 July 2023 09:58 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
Привет.

Попробуй:

EXECUTE BLOCK
RETURNS (TEXT_EXCEPTION VARCHAR(1024) CHARACTER SET NONE)

[Обновления: Mon, 10 July 2023 09:58]

Известить модератора

Re: RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2721 является ответом на сообщение #2720] Mon, 10 July 2023 10:06 Переход к предыдущему сообщениюПереход к следующему сообщению
CyberMax в настоящее время не в онлайне  CyberMax
Сообщений: 8
Зарегистрирован: June 2023
Junior Member
Да, так работает. Спасибо.
Re: RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2722 является ответом на сообщение #2721] Mon, 10 July 2023 10:19 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
CyberMax писал(а) Mon, 10 July 2023 10:06
Да, так работает. Спасибо.
Вообще похоже на баг.

Если подключаться в UTF8, то вроде все работает:

/index.php/fa/146/0/

Я попытался сервер обдурить с помощью префикса _utf8 - не помогает Smile
Re: RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2723 является ответом на сообщение #2722] Mon, 10 July 2023 10:47 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
Я тут еще поигрался Smile

Кодовая страница подключения NONE

Здесь нужно будет самому рулить кодовыми страницами.

Явно приводим строку 'execute block as begin EXCEPTION EXC$CHECK_DATA ''куку''; end' к UTF8 c помощью префикса _utf8.

Первый вариант

Возвращаем UTF8.

/index.php/fa/147/0/

Второй вариант

Возвращаем WIN1251

/index.php/fa/148/0/

Третий вариант

Возвращаем NONE

/index.php/fa/149/0/

[Обновления: Mon, 10 July 2023 10:47]

Известить модератора

Re: RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2724 является ответом на сообщение #2723] Mon, 10 July 2023 11:39 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
Вот еще вариант, который работает для кодовых страниц подключения WIN1251 и UTF8:

EXECUTE BLOCK
RETURNS (TEXT_EXCEPTION VARCHAR(1024))
AS
BEGIN
BEGIN
EXECUTE STATEMENT 'execute block as begin EXCEPTION EXC$CHECK_DATA ''куку''; end';
END
WHEN ANY DO
BEGIN
:TEXT_EXCEPTION = CAST(RDB$ERROR(MESSAGE) AS VARCHAR(512) CHARACTER SET NONE);
SUSPEND;
END
END
Цитата:
exception 4
EXC$CHECK_DATA
куку
At block line: 1, col: 24
At block line: 6, col: 1
Рехнуться можно.

Предположение
1. RDB$ERROR(MESSAGE) всегда говорит что результат UTF8.

2. Если кодовая страница подключения NONE, RDB$ERROR(MESSAGE) возвращает данные в UT8

3. Если кодовая страница подключения НЕ NONE, RDB$ERROR(MESSAGE) возвращает данные в кодовой странице подключения.
Re: RDB$ERROR и русский текст в EXECUTE STATEMENT [сообщение #2725 является ответом на сообщение #2724] Mon, 10 July 2023 11:57 Переход к предыдущему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
Вот еще данные для анализа Smile

Кодовая страница подключения NONE

EXECUTE BLOCK
RETURNS (TEXT_EXCEPTION VARCHAR(1024))
AS
BEGIN
BEGIN
EXECUTE STATEMENT _win1251 'execute block as begin EXCEPTION EXC$CHECK_DATA _win1251 ''куку''; end';
END
WHEN ANY DO
BEGIN
:TEXT_EXCEPTION = RDB$ERROR(MESSAGE);
SUSPEND;
END
END
Цитата:
exception 4
EXC$CHECK_DATA
РєСѓРєСѓ
At block line: 1, col: 24
At block line: 6, col: 1

Если выполним просто
execute block as begin EXCEPTION EXC$CHECK_DATA _win1251 'куку'; end
Получаем ошибку:
Цитата:
exception 4
EXC$CHECK_DATA
РєСѓРєСѓ
At block line: 1, col: 24
Если кодовая страница подключения WIN1251

Первый вариант вернет ошибку

Цитата:
arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets
At block line: 10, col: 1
Второй вариант вернет ошибку

Цитата:
exception 4
EXC$CHECK_DATA
куку
At block line: 1, col: 24
----
Походу предположение верно.

Все, я наигрался Razz
Предыдущая тема: clumplet too long (FB4)
Следующая тема: EXECUTE STATEMENT и "маркеры" кодовых страниц
Переход к форуму:
  


Текущее время: Mon Apr 29 19:36:13 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00701 секунд