Не создается индекс по полю VARCHAR(254)
Модераторы: kdv, Alexey Kovyazin
Не создается индекс по полю VARCHAR(254)
Доброго дня!
Имеем Interbase 2009, размер страницы БД 16384, в таблице codepage win1251, collate win1251.
В таблице есть поле FULL_NAME VARCHAR(254). По этому полю пытаюсь создать индекс. В результате получаю сообщение "key size exceeds implementation restriction for index". Вроде как размер индекса не должен быть больше 1/4 размера страницы БД? Или я ошибаюсь? В чем проблема?
P.S. Максимальный размер поля, по которому мне удалось создать индекс, VARCHAR(136).
Имеем Interbase 2009, размер страницы БД 16384, в таблице codepage win1251, collate win1251.
В таблице есть поле FULL_NAME VARCHAR(254). По этому полю пытаюсь создать индекс. В результате получаю сообщение "key size exceeds implementation restriction for index". Вроде как размер индекса не должен быть больше 1/4 размера страницы БД? Или я ошибаюсь? В чем проблема?
P.S. Максимальный размер поля, по которому мне удалось создать индекс, VARCHAR(136).
Re: Не создается индекс по полю VARCHAR(254)
В Firebird - с версии 2.0. В InterBase - с версии XE.Вроде как размер индекса не должен быть больше 1/4 размера страницы БД?
Re: Не создается индекс по полю VARCHAR(254)
А в версии 2009?kdv писал(а):В Firebird - с версии 2.0. В InterBase - с версии XE.Вроде как размер индекса не должен быть больше 1/4 размера страницы БД?
Re: Не создается индекс по полю VARCHAR(254)
версия XE появилась позже 2009. Я удивлен, что нужно об этом сообщать ![Smile :-)](./images/smilies/icon_smile.gif)
на всякий случай
http://www.ibase.ru/devinfo/allversions.htm
![Smile :-)](./images/smilies/icon_smile.gif)
на всякий случай
http://www.ibase.ru/devinfo/allversions.htm
Re: Не создается индекс по полю VARCHAR(254)
Да это я знаю, не совсем тупойkdv писал(а):версия XE появилась позже 2009. Я удивлен, что нужно об этом сообщать![]()
![Smile :-)](./images/smilies/icon_smile.gif)
Re: Не создается индекс по полю VARCHAR(254)
надо было конкретизировать ![Smile :-)](./images/smilies/icon_smile.gif)
пока не стало 1/4 размера страницы, всегда было, например для win1251 (это двухбайтовый чарсет) - 252 байта без collate, 84 байта с collate, и тут размер страницы не влияет.
Обращаю внимание, что символы могут состоять из нескольких байт, например, в UTF8 (поддерживается и в ИБ, и в ФБ) с этим делом еще хуже, т.е. нужно макс. размер делить на 4, в том числе даже если размер ключа 1/4 страницы в новых версиях.
www.ibase.ru/devinfo/ibrusfaq.htm
www.ibase.ru/unicode_faq.html
если используется utf8 да еще с collate, то размер символа в ключе получается 6 байт, а не 4.
http://www.sql.ru/forum/892796/pagesize ... ar-169-why
![Smile :-)](./images/smilies/icon_smile.gif)
пока не стало 1/4 размера страницы, всегда было, например для win1251 (это двухбайтовый чарсет) - 252 байта без collate, 84 байта с collate, и тут размер страницы не влияет.
Обращаю внимание, что символы могут состоять из нескольких байт, например, в UTF8 (поддерживается и в ИБ, и в ФБ) с этим делом еще хуже, т.е. нужно макс. размер делить на 4, в том числе даже если размер ключа 1/4 страницы в новых версиях.
www.ibase.ru/devinfo/ibrusfaq.htm
www.ibase.ru/unicode_faq.html
если используется utf8 да еще с collate, то размер символа в ключе получается 6 байт, а не 4.
http://www.sql.ru/forum/892796/pagesize ... ar-169-why
Re: Не создается индекс по полю VARCHAR(254)
Что-то я совсем запутался... У меня win1251 c collate. Опытным путем подобрал размер поля varchar(136). Индекс создался, backup восстанавливается, все хорошо. Вот эти 136 символов я никак не могу увязать ни с 252-я байтами, ни с 84-я. Где я ошибаюсь? Тогда по логике, с collate и win1251 у меня максимальный размер поля в индексе должен быть 84 символа, а у меня 136?
Re: Не создается индекс по полю VARCHAR(254)
collate win1251 - это нонсенс. upper работает только в collate pxw_cyrl, а коллэйт win1251 "пустой". Поэтому его надо убирать.
84 - для collate pxw_cyrl. поскольку вы влепили пустопорожний коллэйт win1251, у вас 136. А могло бы быть и 252, если уберете коллэйт. Откуда вы его взяли, кстати? я не припомню, чтобы кто-нибудь когда-либо советовал этот коллэйт использовать.максимальный размер поля в индексе должен быть 84 символа, а у меня 136?
Re: Не создается индекс по полю VARCHAR(254)
Я его не указывал. Он отображается при создании поля в IBExpert-е. Однкао, если посмотреть скрипт, то там будетпоскольку вы влепили пустопорожний коллэйт win1251, у вас 136. А могло бы быть и 252, если уберете коллэйт. Откуда вы его взяли, кстати? я не припомню, чтобы кто-нибудь когда-либо советовал этот коллэйт использовать.
Код: Выделить всё
FULL_NAME VARCHAR(252)
Код: Выделить всё
FULL_NAME VARCHAR(252) COLLATE PXW_CYRL
Re: Не создается индекс по полю VARCHAR(254)
вы где-то говорите неправду.
Только что на IB 2009 сделал:
1. создал базу в win1251
2. создал таблицу со столбцом name1 varchar(252)
3. создал индекс по name1
никаких ошибок.
p.s. рекомендую проверять такие вещи самостоятельно, на пустой базе, это занимает 1-2 минуты вашего времени, не чужого.
Только что на IB 2009 сделал:
1. создал базу в win1251
2. создал таблицу со столбцом name1 varchar(252)
3. создал индекс по name1
Код: Выделить всё
CREATE TABLE X (
ID INTEGER NOT NULL,
NAME1 VARCHAR(252));
ALTER TABLE X ADD CONSTRAINT PK_X PRIMARY KEY (ID);
CREATE INDEX BYNAME1 ON X (NAME1);
p.s. рекомендую проверять такие вещи самостоятельно, на пустой базе, это занимает 1-2 минуты вашего времени, не чужого.