powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
10 сообщений из 10, страница 1 из 1
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38921986
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Имеется вот такой скрипт, записывающий в табличку UTF8-строки длиной не более 8 символов (не байт, а именно символов ).
Затем выводятся значения octet_length этих строк, которые подтверждают, что длина в байтах действительно не превышает 16.
Далее делается смена типа поля с усечением его длины ( что вообще-то проходить не должно), после чего - повторный вывод строк.

Код: plaintext
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.
27.
28.
29.
30.
set autoddl off;
recreate table test(id int);
commit;

set term ^;
execute block as
begin
  execute statement 'drop domain dmxx'; 
when any do begin end
end
^
set term ;^
commit;

create domain dmxx varchar(15) character set none;
--create domain dmxx varchar(16) character set none;
commit;

alter table test add s01 varchar(8) character set utf8;
commit;
insert into test(id, s01) values( 1, 'qwertyui');
insert into test(id, s01) values( 2, 'âêûėżöé');
insert into test(id, s01) values( 3, 'öüčřžéèê');
commit;
select id, s01, char_length(s01) s01_char_length, octet_length(s01) s01_octecs from test;

alter table test alter column s01 type dmxx;
commit;
show table test;

select * from test;

Этот скрипт обламывается с сообщением, в котором лезет непонятное 'expected length 15, actual 32 ':
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
          ID S01      S01_CHAR_LENGTH   S01_OCTECS 
============ ======== =============== ============ 
           1 qwertyui               8            8 
           2 âêûėżöé                7           14 
           3 öüčřžéèê               8           16 

ID                              INTEGER Nullable 
S01                             (DMXX) VARCHAR(15) Nullable 

          ID S01             
============ =============== 
           1 qwertyui        
           2 âêûėżöé  
Statement failed, SQLSTATE = 22001
arithmetic exception, numeric overflow, or string truncation
-string right truncation
-expected length 15, actual 32

Объясните популярно, плз:
1) почему прокатила смена поля на тип домена, в который нельзя затолкать то число символов , которое было задекларировано в старом типе поля ?
2) откудова лезет "32" ? (я понимаю, что это 8*4, а в utf8 на символы может быть отведено максимум 4 байта; но таких символов в таблице нету).

ЗЫ. Не уверен, что браузер покажет UTF8 как надо, поэтому дублирую в аттач скрипт.
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922137
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зануда
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922302
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

чё не так-то ? тип поля поменять *удалось*, как видишь; а данные уже вроде как и не прочитаешь :-)
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922318
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

в какой версии FB?
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922403
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

во вчерашней, проверял на win xp.
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922442
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисв какой версии FB?Таблоидво вчерашнейЭто даже не пять - это 100500
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922506
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так вы с Денисом всё и так поняли, не притворяйтесь :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
ISQL Version: WI-T3.0.0.31756 Firebird 3.0 Beta 2
Server version:
Firebird/Windows/Intel/i386 (access method), version "WI-T3.0.0.31756 Firebird 3.0 Beta 2"
Firebird/Windows/Intel/i386 (remote server), version "WI-T3.0.0.31756 Firebird 3.0 Beta 2/tcp (csprog)/P13"
Firebird/Windows/Intel/i386 (remote interface), version "WI-T3.0.0.31756 Firebird 3.0 Beta 2/tcp (csprog)/P13"
on disk structure version 12.0
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922849
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидИмеется вот такой скрипт, записывающий в табличку UTF8-строки длиной не более 8 символов (не байт, а именно символов )Уверен, что и ты и консорциум юникода одинаково понимаете термин "символ"?
Я напомню, что атом, с которым работает софт - кодовая точка, а символ может состоять из нескольких кодовых точек.
Более того, будет символ составным или нет - зависит от нормализации.
В частности, акцентированные символы могут быть (часто - будут) составными.
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38922881
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovУверен, что и ты и консорциум юникода одинаково понимаете термин "символ"?Да как их не назови, "атомами", "молекулами" етц, - мой вопрос пока так и висит без ответа. А таблица, в которой были манипуляции, прочитываться больше не хочет.
...
Рейтинг: 0 / 0
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
    #38923096
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем, бага это. Ибо в 2.5.х этот фокус не прокатывает.
А потому - CORE-4730
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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