Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ? / 10 сообщений из 10, страница 1 из 1
31.03.2015, 10:22
    #38921986
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
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
31.03.2015, 11:38
    #38922137
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
зануда
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.03.2015, 13:00
    #38922302
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
Мимопроходящий,

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

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

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

Код: 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
31.03.2015, 16:34
    #38922849
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
ТаблоидИмеется вот такой скрипт, записывающий в табличку UTF8-строки длиной не более 8 символов (не байт, а именно символов )Уверен, что и ты и консорциум юникода одинаково понимаете термин "символ"?
Я напомню, что атом, с которым работает софт - кодовая точка, а символ может состоять из нескольких кодовых точек.
Более того, будет символ составным или нет - зависит от нормализации.
В частности, акцентированные символы могут быть (часто - будут) составными.
...
Рейтинг: 0 / 0
31.03.2015, 16:44
    #38922881
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
Basil A. SidorovУверен, что и ты и консорциум юникода одинаково понимаете термин "символ"?Да как их не назови, "атомами", "молекулами" етц, - мой вопрос пока так и висит без ответа. А таблица, в которой были манипуляции, прочитываться больше не хочет.
...
Рейтинг: 0 / 0
31.03.2015, 19:19
    #38923096
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ?
в общем, бага это. Ибо в 2.5.х этот фокус не прокатывает.
А потому - CORE-4730
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Даёт менять поле vc(8) cset UTF8 на vc(15) cset NONE при налич строк с octet_len=16. Why ? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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