Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / EXECUTE STATEMENT изменяет длину строки в UTF8-базе / 13 сообщений из 13, страница 1 из 1
11.11.2014, 16:33
    #38802367
Raxta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Собственно такая проблема. База в UTF8.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
execute block returns (tmp_res varchar(38), str_size integer)
as
declare variable tmp_guid varchar(38);
declare variable tmp_sqltext varchar(300);
begin
  tmp_guid = uuid_to_char(gen_uuid());
  tmp_res = tmp_guid;
  str_size = char_length(tmp_guid);
  suspend;
  tmp_sqltext = 'select ''' || tmp_guid || ''' from rdb$database';
  execute statement (:TMP_SQLTEXT) into :tmp_guid;
  tmp_res = tmp_guid;
  str_size = char_length(tmp_guid);
  suspend;
end



Данный код возвращает для одной и той же строки разный размер char_length(). Причем если это происходит в ХП, то varchar(38) волшебным образом умещает в себе varchar(152). Кто-нибудь может знает почему? Дело в кривых руках или ошибка в FB?
...
Рейтинг: 0 / 0
11.11.2014, 16:41
    #38802381
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
RaxtaДело в кривых руках или ошибка в FB?
если вопрос стоит именно так, то нафига сразу писать в трекер?
...
Рейтинг: 0 / 0
11.11.2014, 16:45
    #38802394
Raxta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
dimitr,

наверное потому что трекер для того и нужен, что бы туда писать, а там разработчики решали, ошибка это или нет.
...
Рейтинг: 0 / 0
11.11.2014, 16:50
    #38802403
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Raxta,

вообще-то не так. Если ты уверен, что это баг, смело пиши в трекер. Если сомневаешься, спроси здесь, и только когда подтвердят, пиши в трекер. Иначе на фига ты этот вопрос здесь задал?
...
Рейтинг: 0 / 0
11.11.2014, 17:07
    #38802437
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
RaxtaКто-нибудь может знает почему?
Только чайники не знают, что строковые литералы имеют тип CHAR. Так что расслабься, не ты
первый, не ты последний.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.11.2014, 19:09
    #38802664
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Симонов Денис> вообще-то не так.

Вообще говоря - как раз так. Ибо про "здесь" знают
не все, про наличие тут разработчиков - тем более.
Ну а вкупе с годами культивировавшейся позицией
"трекер всё стерпит"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.11.2014, 19:28
    #38802699
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Не важно в чём база. Важен чарсет коннекта.
Если чарсет коннекта win1251, то выводится 36 36.
Если чарсет коннекта utf8, то выводится 36 38.

Если кто-то может это объяснить - велкам :)
...
Рейтинг: 0 / 0
11.11.2014, 20:02
    #38802725
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
execute block returns (str_size integer)
as
declare variable s varchar(1);
begin
  execute statement ('select ''1'' from rdb$database') into :s;
  str_size = char_length(s);
  suspend;
end
----
1

execute block returns (str_size integer)
as
declare variable s varchar(10);
begin
  execute statement ('select ''1'' from rdb$database') into :s;
  str_size = char_length(s);
  suspend;
end
----
4



Бага.
...
Рейтинг: 0 / 0
11.11.2014, 20:53
    #38802781
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
это баян на тему CHAR и UTF8 во внешнем АПИ, в трекере ищите
...
Рейтинг: 0 / 0
12.11.2014, 07:09
    #38802941
Raxta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Хорошо, раз это не баг и я, как это и предполагалось, чайник, ответьте, пожалуйста еще на такой вопрос. В описании к функции CHAR_LENGTH() сказано: "Gives the length in characters of the input string.". Тогда получается, у EXECUTE STATEMENT все равно не корректное поведение в том плане, что оно строку размерностью 38 увеличивает до строки размерностью 152 и заполняет пустое пробелами.
...
Рейтинг: 0 / 0
13.11.2014, 07:53
    #38804256
Raxta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Все решилось логично :) Ошибка исправлена, войдет в 2.5.4. Ну а пока придется избегать в некоторых случаях EXECUTE STATEMENT
...
Рейтинг: 0 / 0
13.11.2014, 18:04
    #38805341
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
и 2.1.7 (интереса ради?)
...
Рейтинг: 0 / 0
13.11.2014, 18:06
    #38805347
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE STATEMENT изменяет длину строки в UTF8-базе
Arioch,

его не будет.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / EXECUTE STATEMENT изменяет длину строки в UTF8-базе / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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