|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Добрый день. Делал по аналогии, как где нашел. Код: sql 1. 2. 3. 4. 5. 6.
Код: sql 1. 2. 3. 4. 5. 6. 7.
Строчки, в которых цифры и англ. буквы - возвращаются запросом, если в строке русские буквы - malformed string. Подскажите, пожалуйста, что исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 15:28 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Hello, Devillio! You wrote on 31 августа 2016 г. 15:32:03: Devillio> MainUnit.MyINIReadString возвращает String в сильно разных дельфях этот самый "стринг" сильно разный. иди к дельфятникам. зы: тут Delphi никто не знает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 15:33 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Delphi XE2. А тему пересоздать или переместят? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 15:39 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Devillioчто исправить? Практически всё. Начиная с работы с памятью и кончая преобразованием к utf-8. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 15:46 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
DevillioПодскажите, пожалуйста, что исправить? 16518686 пример в floattochar, и не забывай про free_it. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 15:59 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, спасибо! без преобразований, вот так заработало ))) procedure INIReadString(AStrSection, AStrParam, AINIData: PAnsiChar; DefaultParam: PAnsiChar); cdecl; export; begin StrPCopy(DefaultParam, AnsiString(MainUnit.MyINIReadString(AStrSection, AStrParam, AINIData, DefaultParam))); end; DECLARE EXTERNAL FUNCTION INIREADSTRING CSTRING(128), CSTRING(128), CSTRING(1024), CSTRING(512) RETURNS PARAMETER 4 ENTRY_POINT 'INIReadString' MODULE_NAME 'levdis.dll'; подскажите, так "с памятью" нормально или что-то еще надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:01 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Devillio, http://www.ibase.ru/unicode_faq/ в самом конце, последний пункт про udf. Но тут не надо забывать, что в udf передаются строки в чарсете данных или чарсете коннекта. Если ты явно не объявляешь чарсет параметров udf, то чарсет будет как "по умолчанию у БД". И если у базы win1251, то параметры будут win1251, и соответственно, возникнет преобразование из чарсета коннекта в чарсет параметра udf. А если параметры явно в utf8 объявлены, то тогда внутри udf преобразование бессмыслено. В последнем твоем варианте MyINIReadString должно понимать параметры в utf8. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:09 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Devillioтак "с памятью" нормально или что-то еще надо? С памятью так нормально, но с остальным, как уже сказали, работает до первого дятла. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:15 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, в моем примере может быть не совсем понятно, с какого рожна входные строки PAnsiString. Хотя первое же преобразование типа (UTF8String(p1)) как бы намекает, что к чему. Впрочем, надо будет наваять вообще чистую utf8 udf... Хотя вроде там и ваять-то нечего. объявляем параметры с чарсетом utf8, получаем utf8string, возвращаем utf8string. По идее, так и должно быть. Но надо проверить... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:23 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Hello, Kdv! You wrote on 31 августа 2016 г. 16:27:37: Kdv> надо проверить...в статье добавь указание версии делфи. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:29 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
kdv, А позвольте глупый вопрос? А если БД создавать с UTF8 кодировкой - она будет универсальной для всех языков? Просто сейчас попробовал - создал с charset UDF8, соединяюсь с таким же, вроде бы русский язык работает, эта функция UDF - тоже. Где здесь грабли будут? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:34 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
DevillioА если БД создавать с UTF8 кодировкой - она будет универсальной для всех языков? кодировка у базы - это не кодировка базы, а ШАБЛОН чарсета, который будет использоваться для строковых (и текстовых блобов) типов данных при создании объектов - таблиц, процедур, функций, view, если у них чарсет явно не указан . Например. Создаем базу "в win1251". Пишем create table a (name varchar(30); столбец name будет иметь чарсет win1251. пишем в этой же базе create table a (name varchar(30) character set utf8; столбец name будет иметь чарсет utf8. И т.д. Собственно, у базы указывается DEFAULT character set, а не просто character set. Так что, у одной таблицы разные столбцы могут иметь разные чарсеты, отличные от default, если их указать явно. А вот дальше уже будет работать преобразование "чарсет коннекта" -> "чарсет столбца/параметра". ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:44 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Огромная благодарность за разъяснения! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:47 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
DevillioОгромная благодарность за разъяснения! Я-ж говорю, сайт ibase нафиг не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2016, 16:52 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
....и выкопаю стюардессу! Как на интерпретацию CSTRING и особенно его "размера" в скобках влияют: 1) connection charset ? 2) database default charset ? Я к тому, что вот тут - http://freeadhocudf.org/documentation_english/dok_eng_blob.html - у функций идут параметры CSTRING(32760) - причем и в UTF-8 версиях и в неюникодных, один чёрт. А вот тут на FB 2.5.5 пытаются объявить CSTRING(32660) - и выпадают на implementation limit exceeded https://stackoverflow.com/questions/49547235/firebird-errors-when-using-symmetricds ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 13:13 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
....и ещё раз выкопаю. Посмотрел лангреф и девгайд IB6, лангрефы FB2.5 (Eng&Rus) - везде говорится, что предел размера CSTRING указан в байтах, а не в буквах. Про кодировку же самих букв не говорится вообще ни в одной доке... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 13:15 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Так же как и у любого другого поля/параметра чарсет параметров UDF наследуется от умолчательного чарсета БД если не указан явно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 13:25 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТак же как и у любого другого поля/параметра здесь ты неявно отсылаешь "к любому другому" SQL-типу данных но CSTRING - он если смотреть синтаксические диаграммы в доках вовсе не стандартный тип данных, а особый исключительный случай, а для него кодировки не прописаны https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-ddl-extfunc.html а предел длины и вовсе явно прописан в байтах, а не буквах.... -------- хотя смотрю я в ib_udf2.sql и вижу там DECLARE EXTERNAL FUNCTION strlen STRING(32767) CHARACTER SET NONE то есть, можно, нло в документации пропустили а вот для сравнения в ib_udf.sql кодировки нет - DECLARE EXTERNAL FUNCTION strlen СSTRING(32767) RETURNS .... в fbudf.sql нету вообще CSTRING ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 14:01 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
AriochКак на интерпретацию CSTRING и особенно его "размера" в скобках влияют: 1) connection charset ? 2) database default charset ? на втором вопросе я скоро язву заработаю - дефолтный чарсет базы, это чарсет, который используется для строковых столбцов или переменных, если у них никакой чарсет не указан. При создании метаданных - таблиц, процедур, триггеров. Больше "дефолтный чарсет" ни для чего не используется. Так что, если метаданные УЖЕ существуют, про дефолтный чарсет можно забыть. Чарсет коннекта - определяет перекодирование или его отсутствие, если чарсет данных не совпадает с чарсетом коннекта. При чем тут "размер cstring в скобках"??? Он если и относится, то ко второму вопросу. И то, если чарсет не указан явно. авторпредел размера CSTRING указан в байтах, а не в буквах. Про кодировку же самих букв не говорится вообще ни в одной доке... не надо ля-ля, про "не говорится". Написано в руководстве по языку, например по ФБ 2.5 - страница 34. " для более экзотических алфавитов, рекомендуется работать с набором символов UTF8. При этом следует иметь в виду, что на один символ в данном наборе приходится до 4 байт. Следовательно, максимальный размер символов в символьных полях составит 32676/4 (8192) байта на символ. При этом следует обратить внимание, что фактически значение параметра «байт на символ» зависит от диапазона, к которому принадлежит символ: английские буквы занимают 1 байт, русские буквы кодировки WIN1251 — 2 байта, остальные символы — могут занимать до 4-х байт. " А насчет CSTRING - все те же правила по длине и кодировкам, что и для CHAR/VARCHAR. CSTRING просто 0-терминируемая строка, специфическая для udf. Ты, собственно, чего хочешь - чтобы в документации дописали пару предложений? Или чтобы ... что? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 16:18 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
kdv, Чтобы выяснили как реально обстоят дела и чётко отразили в обеих документациях, ENG/RUS > например по ФБ 2.5 - страница 34. Открываю официальный сайт, https://www.firebirdsql.org/en/reference-manuals/ Открываю официальное руководство Firebird 2.5 Language Reference (Russian) "6 сентября 2015 — v.0336-1 для Firebird 2.5.4", страница 34, "Подтипы BLOB" и "Особенности BLOB" BLOB <> CSTRING Делаю полнотекстовый поиск, твой кусок нахожу на страницах 29/30 Символьные типы данных В СУБД Firebird для работы с символьными данными есть тип данных фиксированной длины CHAR и строковый тип данных VARCHAR переменной длины. {VAR}CHAR <> CSTRING > Так что, если метаданные УЖЕ существуют ....и у эти метаданных есть чарсет - то да. А если нет? По документации у CSTRING никакого чарсета нет! > Чарсет коннекта - определяет перекодирование или его отсутствие А если у БД нет своего коннекта, например NONE ? А если коннект используется для создания БД на сервере, а не к уже существующей БД. Исходная ситуация: есть БД, она пересоздается и переливаются данные, в процессе этого вылезает превышение implementation limit, которого 1) на исходной БД нет; 2) не должно быть по докам; 3) не должно быть по прецеденту fbUDF (тот еще прецедентик, но какой есть, ПОСЛЕ облома с документацией). Понимаешь, в тот момент когда сервер ведёт себя не по документации - под сомнение ставится всё. Причина ошибки ищется в любом возможном месте. Потому что, если ошибка возникает в "правильном" и очевидном месте - он решается не приходя в сознание и на форумы никто не лезет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 17:49 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Arioch, потому что CSTRING это не тип данных Firebird и за пределами DECLARE EXTERNAL FUNCTION не используется. При возврате из функции он скорее всего приводится к CHAR или VARCHAR (точно не скажу). Возможно проблема в этом самом приведении. У меня тоже нет сведений как это работает. CSTRING(<size>) прямо отображается на AnsiChar[<size>] поэтому непосредственного чарсета у этого "типа" быть не может ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 18:07 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Симонов ДенисПри возврате из функции он скорее всего приводится к CHAR или VARCHAR (точно не скажу). Возможно проблема в этом самом приведении. У меня тоже нет сведений как это работает. Лично я не осилил, что ты пытался сказать. Приведение делается к типу объекта "присвоения" - т.е. "переменная слева", cast, поле и пр. Включая чарсет, разумеется, если они разные. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 18:30 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Симонов ДенисCSTRING(<size>) прямо отображается на AnsiChar[<size>] поэтому непосредственного чарсета у этого "типа" быть не можетЭто чушь, ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 18:30 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, почему же чушь. Как оно будет внутри UDF выглядить? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 20:05 |
|
Помогите передать Ansi строчку из UDF
|
|||
---|---|---|---|
#18+
Симонов Денис> Как оно будет внутри UDF выглядить? Не понял вопроса. Внутри UDF будет выглядеть как-то (как запрограммируют), в каком-то чарсете. Снаружи - как будет нужно снаружи, т.е. в т.ч. вдруг чарсете. Тут UDF, в т.ч. CSTRING, от любых других строк и литералов ничем не отличается - чарсеты приводятся совершенно прозрачно и автоматически. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 20:49 |
|
|
start [/forum/topic.php?fid=40&fpage=35&tid=1561187]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 298ms |
total: | 431ms |
0 / 0 |