powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите передать Ansi строчку из UDF
25 сообщений из 52, страница 2 из 3
Помогите передать Ansi строчку из UDF
    #39622918
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Ну и догадаться внутри UDF в каком оно там чарсете прислано практически не возможно для любого из типов. У самого CSTRING чарсета указать нельзя, впрочем для остальных типов тоже. Так что ты наверное прав
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39622934
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНу и догадаться внутри UDF в каком оно там чарсете прислано практически не возможно для
любого из типов.

При передаче by descriptor в нём есть и чарсет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39622941
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

мда уж. Давненько я в UDF не залазил, пора освежить память. Замолкаю
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39622969
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспочему же чушь. Как оно будет внутри UDF выглядеть?
ответственно заявляю - чарсеты одинаково выглядят и конвертируются для char, varchar и cstring.
Да, cstring существует только для UDF, но это не меняет отношения к чарсетам.
Как внутри udf выглядит cstring, никого не колышет, главное чтобы оно
- имело корректный чарсет
- завершалось нулем, как положено.

Если прописать внутри udf в строке какую-нибудь хрень, а на выходе это должно быть cstring character set utf8, то на выходе и получим тоже хрень. Этого избежать никак нельзя.
Да, udf должна уметь обрабатывать данные внутри в зависимости от чарсета входящих строк. То есть, udf должна ЗАРАНЕЕ знать об обрабатываемом входном и выходном чарсете. Это, как бы, логическое следствие того, что явно чарсет строк в UDF никак не передается.
Про это я писал тут, в конце:
http://www.ibase.ru/unicode_faq/
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39622970
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

еще бы кто-то этот by descriptor использовал.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623017
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovСимонов ДенисНу и догадаться внутри UDF в каком оно там чарсете прислано практически не возможно для
любого из типов.

При передаче by descriptor в нём есть и чарсет.

kdvDimitry Sibiryakov,

еще бы кто-то этот by descriptor использовал.
Раз вы оба за то что при передаче by descriptor передаётся чарсет, значит он действительно передаётся.
Только в каком поле?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  TDSC = packed record
    dsc_dtype: byte;
    dsc_scale: byte;
    dsc_length: word;
    dsc_sub_type: word;
    dsc_flags: word;
    dsc_address: pointer;
  end;
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623029
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

вот много чего написано про UDF, в том числе и про BY DESCRIPTOR. И там упоминается что мол можно получить charset, но я нигде не увидел примера как это сделать.

http://www.ibphoenix.com/files/Writing-External-Functions.pdf
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623058
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

спасибо.
the sub_type (represents the blob's subtype and for string types, it is the charset
plus the collation, encoded)

Один байт - чарсет, другой - collation.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623069
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

ну и хорошо. Я в свою очередь обновлю в документации по SQL описание BY DESCRIPTOR и всего того, что касается языковых конструкций SQL для EXTERNAL FUNCTION согласно этому документу на выходных.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623120
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HommerСимонов Денис,

спасибо.
the sub_type (represents the blob's subtype and for string types, it is the charset
plus the collation, encoded)

Один байт - чарсет, другой - collation.
Только входные данные не преобразуются к чарсету параметра.
Т.е. если функция объявлена как:
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION F
VARCHAR(100) character set utf8 BY DESCRIPTOR
RETURNS INTEGER BY VALUE
ENTRY_POINT 'F' MODULE_NAME 'F.dll';

и подключиться с чарсетом win1251, то при
Код: sql
1.
select F('Русский текст') from rdb$database

внутри udf будет dsc_sub_type = 52

А если подключиться с чарсетом utf8, то при
Код: sql
1.
select F('Русский текст') from rdb$database

внутри udf будет dsc_sub_type = 1028. Причём collate во втором случае похоже равен collate БД (у меня он 4).

Собственно в документации и написано что туда можно передать всё что угодно, хоть число, и оно не будет преобразовано к варчару:
We will see later that
with this mechanism, the engine does not bother to check that the UDF's declared type for
the param is the same as the value that will be passed. Use it only if you know what
you're doing.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623123
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

я пока не вчитывался. От использования UDF отказался ещё при переходе 1.5 -> 2.5. А сейчас вообще на 3.0 сижу
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623141
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerТолько входные данные не преобразуются к чарсету параметра.

и это вряд ли будет правится. UDF в 4.0 признаны устаревшими, теперь надо писать UDR. Там возможностей намного больше, но и писать их несколько сложнее.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623200
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerТолько входные данные не преобразуются к чарсету параметра.

Собственно в документации и написано что туда можно передать всё что угодно, хоть число, и
оно не будет преобразовано к варчару:
Вот именно: при передаче дескриптора описание параметра игнорируется целиком, включая тип
и чарсет, разумеется. Просто кому-то было лень перекраивать синтаксис параметров при его
вводе, поэтому там и осталась такая вот грязь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623222
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

его перекраили для новых PSQL функций и UDR
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623344
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerТолько входные данные не преобразуются к чарсету параметра.
гм, интересно. значит я был неправ.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623469
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochА вот тут на FB 2.5.5 пытаются объявить CSTRING(32660) - и выпадают на implementation limit exceeded
https://stackoverflow.com/questions/49547235/firebird-errors-when-using-symmetricds

Подброшу. Попросил человека посмотреть кодировки старой и новой БД.

I executed this SELECT RDB$CHARACTER_SET_NAME FROM RDB$DATABASE,
the old DB return UNICODE_FSS,
and new DB return NONE

То есть каким-то странным образом (может ли это зависеть от диалекта, от ODS???) у него CSTRING(32660) срабатывало на многобайтовой (хотя и устаревшей) UNICODE_FSS, но не срабатывает на 1-байтовой NONE

Странно это....
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623471
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисУ меня тоже нет сведений как это работает.

я догадывался.

Вот именно поэтому я это и поместил не в ветку о документации, а в общем разделе, пускай гуру посмотрят потестируют и сами поймут
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623477
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисCSTRING(<size>) прямо отображается на AnsiChar[<size>] поэтому непосредственного чарсета у этого "типа" быть не может

Извините - но ANSIchar и ANSIstring как раз оооочень lf;имеют кодировку.
Это у юникода кодировки нет, есть только Transport Format.

А вот у ANSI есть Win1250, Win1252, oem850, oem866, KOI8-R, KOI8-U, KOI8-RU - на сайта Майкрософта несколько дестяков кодовых страниц, включая разные EBCDIC
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623483
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerСимонов Денис,

спасибо.
the sub_type (represents the blob's subtype and for string types, it is the charset
plus the collation, encoded)

Один байт - чарсет, другой - collation.

Нуц а для блобов subtype имеет свое значение, там видимо надо добираться до

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
typedef struct
{
	short			blob_desc_subtype;
	short			blob_desc_charset;
	short			blob_desc_segment_size;
	ISC_UCHAR	blob_desc_field_name[32];
	ISC_UCHAR	blob_desc_relation_name[32];
} ISC_BLOB_DESC;
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623484
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochне срабатывает на 1-байтовой NONE

NONE - не однобайтовая. Это вообще затычка для "передавай строки как есть, тупым массивом
байт".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623489
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvHommerТолько входные данные не преобразуются к чарсету параметра.
гм, интересно. значит я был неправ.

Это только в случае BY DESCRIPTOR, про это явно написан ов русской документации (я вроде даже цитировал) и это по своему логично - если ты хочешь получить сырые не испорченные преобразованиями данные с низкоуровневым нативным файрбёрдовским описанием их - вот оно тебе пожалуйста.

Другой вопрос зачем при этом тип указывать? так и писали бы ,что такой-то параметр UDFки имеет тип "дескриптор"
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623492
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAriochне срабатывает на 1-байтовой NONE

NONE - не однобайтовая. Это вообще затычка для "передавай строки как есть, тупым массивом
байт".

Угу, а размер элемента "тупого массива байт" внезапно 1 байт, как я и сказал.

Откуда же implementation limit exceeded ?

Самый безумный вариант, они слишком давно commit не делали и на стопиццотом DDL сервер сломался, а то что при этом создавалас UDF - просто совпадение. Могло такое быть ?
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623496
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

да какая разница теперь зачем? Всё UDF развивать больше не будут, а в новом типе функций всё по другому
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623498
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

что именно "зачем" ?

функционал есть, унаследованных программ - много.
люди на грабли натыкаются, по факту.
...
Рейтинг: 0 / 0
Помогите передать Ansi строчку из UDF
    #39623504
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochСамый безумный вариант, они слишком давно commit не делали и на стопиццотом DDL сервер сломался, а то что при этом создавалас UDF - просто совпадение. Могло такое быть ?

а вообще - нет, он же там на одной этой команде в IBExpert получает ту же ошибку....
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите передать Ansi строчку из UDF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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