Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 pagesize 4096: допускает создание индекса по UTF8-полю только до varchar(169). Why ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
hi all

LI-V2.5.1.26308 Firebird 2.5

SQL> create database "testutf8.fdb" pagesize 4096; commit;
SQL> connect testutf8.fdb;
Database: testutf8.fdb

Далее выполняю вот это:
[firebird@firebird firebird]$ isql -n testutf8.fdb
Database: testutf8.fdb
SQL> recreate table ttt (id int); commit;
set term ^;
execute block as begin
execute statement 'drop domain utf8_ci;';
SQL> set term ^;
SQL> execute block as begin
CON> execute statement 'drop domain utf8_ci;';
CON> when any do begin end
CON> end^
SQL> set term ;^
SQL> commit;
SQL> create domain utf8_ci as varchar(169) character set utf8 collate unicode_ci; commit;
recreate table ttt (id int,name utf8_ci not null unique collate unicode_ci); commit;
SQL> recreate table ttt (id int,name utf8_ci not null unique collate unicode_ci); commit; -- прокатило Ок.

А теперь так:
SQL> recreate table ttt (id int); commit;
set term ^;
execute block as begin
SQL> set term ^;
SQL> execute block as begin
CON> execute statement 'drop domain utf8_ci;';
CON> when any do begin end
CON> end^
SQL> set term ;^
SQL> commit;
SQL> create domain utf8_ci as varchar(170) character set utf8 collate unicode_ci; commit;
SQL> recreate table ttt (id int,name utf8_ci not null unique collate unicode_ci); commit;
Statement failed, SQLSTATE = 42000
unsuccessful metadata update
-key size exceeds implementation restriction for index "RDB$16"

Онлайн-калькулятор размера ключа FB-индекса для страницы 4096 и charset'a = UTF8 показывает, что я могу на такой странице сделать индекс с ключем до 255 символов.
Облом, как видим, случается гораздо ранее.

Это почему так ?
3 ноя 11, 14:31    [11546404]     Ответить | Цитировать Сообщить модератору
 Re: pagesize 4096: допускает создание индекса по UTF8-полю только до varchar(169). Why ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51521

Таблоид
Это почему так ?

Потому что _ci. Шесть байт на символ.

Posted via ActualForum NNTP Server 1.4

3 ноя 11, 14:38    [11546457]     Ответить | Цитировать Сообщить модератору
 Re: pagesize 4096: допускает создание индекса по UTF8-полю только до varchar(169). Why ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
Dimitry Sibiryakov
Потому что _ci. Шесть байт на символ.
Поднимаю тему.
Не получается шесть байт на символ:
-- create collation ci_coll for utf8 from unicode case insensitive; commit;

recreate table t01(id int); commit;
set term ^;
execute block as begin
execute statement 'drop domain t01_dm_utf8_a;'; when any do begin end
end^
execute block as begin
execute statement 'drop domain t01_dm_utf8_b;'; when any do begin end
end^
execute block as begin
execute statement 'drop domain t01_dm_utf8_c;'; when any do begin end
end^
set term ;^
commit;
create domain t01_dm_utf8_a as varchar(10) character set utf8; commit;
create domain t01_dm_utf8_b as varchar(10) character set utf8 collate ci_coll; commit;
create domain t01_dm_utf8_c as varchar(10) character set utf8 collate unicode_ci; commit;
Смотрим расшифровку длин полей в rdb$fields:
select
   f.rdb$field_name f_name
  ,f.rdb$field_length f_len
  ,f.rdb$field_scale f_sca
from rdb$fields f
where f.rdb$field_name like 'T01_DM%'
Result:
F_NAMEF_LENF_SCA
T01_DM_UTF8_A400
T01_DM_UTF8_B400
T01_DM_UTF8_C400

Хранение требует 4 байта на символ, а не 6.
Или это только в таблице 4, а в индексе - 6 байт на символ ?
(ibase.ru/devinfo/ib_unicode.htm - смотрел; doc/readme.intl - читал; на официальном сайте нашёл только про новые коллации в 2.1 - но нигде ничего про затраты на хранение не написано)

PS. Забавно, но для китайско-корейско-японских чарсетов получается по 2 байта, а на тайский - всего 1 байт :-)
+ DDL
create domain t01_dm_utf8_e as varchar(10) character set big_5; commit;
create domain t01_dm_utf8_f as varchar(10) character set ksc_5601; commit;
create domain t01_dm_utf8_g as varchar(10) character set sjis_0208; commit;
create domain t01_dm_utf8_h as varchar(10) character set eucj_0208; commit;
create domain t01_dm_utf8_i as varchar(10) character set gb_2312; commit;
create domain t01_dm_utf8_j as varchar(10) character set cp943c; commit;
create domain t01_dm_utf8_k as varchar(10) character set tis620; commit;
F_NAMEF_LENF_SCA
T01_DM_UTF8_E200
T01_DM_UTF8_F200
T01_DM_UTF8_G200
T01_DM_UTF8_H200
T01_DM_UTF8_I200
T01_DM_UTF8_J200
T01_DM_UTF8_K100
25 дек 11, 10:26    [11821831]     Ответить | Цитировать Сообщить модератору
 Re: pagesize 4096: допускает создание индекса по UTF8-полю только до varchar(169). Why ?  [new]
hvlad
Member

Откуда:
Сообщений: 11081
Таблоид
Или это только в таблице 4, а в индексе - 6 байт на символ ?
Да
25 дек 11, 12:20    [11821916]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить