powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
25 сообщений из 115, страница 1 из 5
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730617
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, subj.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730622
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ась?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730629
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, формирую строку EXCEPTION на кириллице из переменной, а она в IBExpress кракозябрами вылетает. Чот туплю...
Какой у переменной должен быть CHARSET?
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730637
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, CHARSET соединения WIN1251, а строку на кириллице пихал в переменную :msg c CHARSET UTF8. Одна из ХП должна плевать мою строку в виде:
EXCEPTION "ID__xConvert" :msg || 'бла-бла-бла';
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730676
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепробовал UTF8, UNICODE_FSS, WIN1251, ISO8859_5 - не помогает.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730685
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

забей, то что ты хочешь не работоспособно. В трёшке кое как выкрутились с USING, но в целом проблема с конвертацией текста эксепшенов собираемых пользователями из переменных разных кодировок в нужный чарсет не решена.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730689
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, печально... И на том спасибо!
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39730712
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пиши всё на английском.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731642
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, мне удалось!

Сразу прошу прощения, что в самом начале маленько наврал с CHARSET'ом подключения, который у меня в IBExpert оказался UTF8, а не WIN1251. При WIN1251 сообщение на кириллице от исключения прилетало вполне читаемым. Не суть... Мне удалось сделать так, что теперь сообщение прилетает читаемым при любом CHARSET'е подключения - хоть UTF8, хоть WIN1251, но с условием, что известен CHARSET по умолчанию ОС клиента.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
-- для сообщения исключения с заранее известным CHARSET по умолчанию ОС клиента
CREATE DOMAIN CLIENT_MESSAGE AS VARCHAR(1023) CHARACTER SET WIN1251;
-- workaround for malformed string
CREATE DOMAIN EXCEPTION_MESSAGE AS BLOB CHARACTER SET NONE;

SET TERM ^;
CREATE OR ALTER PROCEDURE CONVERT_EXCEPTION_MESSAGE
  (
    "msg" CLIENT_MESSAGE
  )
  RETURNS
  (
    RET EXCEPTION_MESSAGE
  )
AS
BEGIN
  RET = "msg";
  SUSPEND;
END^
SET TERM ;^

-- Форма отстрела исключения
DECLARE VARIABLE msg VARCHAR(200) CHARACTER SET UTF8 DEFAULT 'Тестовое ';
...
EXCEPTION my_exception
  (SELECT RET FROM CONVERT_EXCEPTION_MESSAGE(:msg || 'сообщение'));

При желании можно сделать, чтобы клиентский софт устанавливал контекстную переменную с указанием CHARSET'а ОС по умолчанию, а строка сообщения бралась из таблицы по ключу указанного CHARSET'а с заворачиванием конвертации в EXECUTE STATEMENT, на выходе которого будет BLOB CHARACTER SET NONE.

Резюмирую: проблема нечитаемых сообщений исключений кроется не в сервере, а в клиенте. Когда мы в EXCEPTION указываем строку в какой-либо кодировке, то она преобразуется к кодировке по умолчанию БАЗЫ ДАННЫХ, а на клиенте интерпретируется как строка с CHARACTER SET NONE.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731661
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

жесть конечно. Я думаю тут можно и без второй ХП обойтись
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731670
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, наверно можно, если Cast из VARCHAR к BLOB нормально отработает.

Кажется, я в резюме немного ошибся - строка EXCEPTION конвертируется не к кодировке БД, а к кодировке подключения. То есть. На сколько я понимаю, достаточно в fbclient интерпретировать строку исключения не как строку в кодировке NONE, а как строку в кодировке подключения.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731679
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

во первых блоб там не к чему ибо длина сообщения эксепшена и так ограничена. Вроде как 1023 байтами
Во вторых всю конвертацию можно сделать непосредственно в той процедуре где исключение бросается. Достаточно всего лишь конвертировать через дополнительную локальную переменную
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731681
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, без BLOB'а вылетает malformed string.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731685
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВо вторых всю конвертацию можно сделать непосредственно в той процедуре где исключение бросается. Достаточно всего лишь конвертировать через дополнительную локальную переменнуюМне не хотелось в выстреливающей исключение ХП делать кучу BEGIN...END, ухудшающих читаемость.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731732
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

может я что-то не так делаю. Мне ни разу не удалось воспроизвести твою проблему. Везде вижу нормальный русский текст безо всяких приседаний с ХП и конвертацией в BLOB
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731751
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, у тебя кодировка подключения WIN1251 или UTF8?
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731758
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

и так и так пробовал (3.0, 4.0). Давай скрипт воспроизведения. Может придумаю как более просто сделать
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731765
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, у меня:
Код: plsql
1.
SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM RDB$DATABASE

выдает 2.5.9 :)
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731767
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

ты скрипт воспроизведения дай. Не обязательно целиком твою секретную процедуру. Просто минимальный скрипт для воспроизведения
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731786
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, процедуру не дам, потому как зависимостей дофига, а воспроизведение - пожалуйста:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR ALTER EXCEPTION "my_exception" 'ID''s conversion exception';

SET TERM ^;
CREATE OR ALTER PROCEDURE oneRow
  RETURNS
  (
    tmstmp TIMESTAMP
  )
AS
  DECLARE VARIABLE msg VARCHAR(200) CHARACTER SET UTF8
    DEFAULT 'Тестовое ';
BEGIN
  EXCEPTION "my_exception" :msg || 'сообщение';
  tmstmp = CURRENT_TIMESTAMP;
  SUSPEND;
END^
SET TERM ;^

SELECT RDB$GET_CONTEXT('SYSTEM', 'ENGINE_VERSION') FROM oneRow;


Кодировка БД по умолчанию и кодировка подключения UTF8, версия FirebirdSQL сервера WI-V6.3.9.27110, версия клиента (fbclient) 2.5.9.27110, версия IBExpert'а 2018.11.1.2, кодировка файла скрипта "UTF8 (with BOM)".
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731791
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню, текст исключений - единственное поле в системных таблицах с кодировкой NONE.
Посему как туда что записали, так оно там и лежит.
Когда это извлекается, оно никуда не приводится и передаётся клиенту как есть.

Клиент, есс-но не знает, как интерпретировать строки в NONE.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731805
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladКлиент, есс-но не знает, как интерпретировать строки в NONE.Естественно!
Но в строке сообщения по умолчанию для исключения у меня только символы ASCII "ID's conversion exception", а при выстреле EXCEPTION подставляется строка на кириллице. Причем, совершенно не важно, будет ли строковая переменная msg в кодировке UTF8 или WIN1251 - строка на сервере всё равно будет приведена к кодировке подключения, а на клиенте будет воспринята как строка с кодировкой NONE.
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731811
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

не единственное (RDB$ENTRYPOINT, RDB$FILE_NAME), но они вроде не мешают
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731813
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, воспроизводится?
...
Рейтинг: 0 / 0
напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
    #39731825
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

да. Ну как я и говорил. С исключениями пока всё плохо. А твои выкрутасы может и спасают но выглядят как кривой костыль.
Каждый раз создавать временный блоб как то стрёмно.

hvlad,

в Firebird 4.0 ничего насчёт исключений не думали?
...
Рейтинг: 0 / 0
25 сообщений из 115, страница 1 из 5
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / напомните, плз, в каком CHARSET'е выплёвывается сообщение EXCEPTION - UNICODE_FSS?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]