Клименчук Сергей wrote:
CREATE TABLE T1 (
    F1  VARCHAR(128) CHARACTER SET OCTETS
);

CREATE UNIQUE INDEX IDX1 ON T1 (F1);

Вставляем пару строк, отличающихся
наличием/кол-вом концевых нулей.
Все нормально.

alter index idx1 inactive;
alter index idx1 active;

"attempt to store duplicate values on unique index"

Что Тебе не нравится? То, что в первом случае ФБ разрешил вставку или же то, что для Тебя все-таки это как-бы различные строки?

Смотри например сюда, это конечно не OCTETS, но идея та же:

SQL> connect 'unique_str.fdb' user 'sysdba' password 'masterkey';
Database:  'unique_str.fdb', User: sysdba
SQL> create table uniq(col1 varchar(10) character set win1252 unique);
SQL> commit;
SQL> insert into uniq values('a');
SQL> commit;
SQL> insert into uniq values('a ');
Statement failed, SQLCODE = -803
violation of PRIMARY or UNIQUE KEY constraint "INTEG_1" on table "UNIQ"
SQL>

В SQL две строки считаются эквивалентными, даже если у них различное количество пробелов в конце. В OCTETS 0x00 итерпретируется как пробел, а в этом случае 0x01 0x00 и 0x01 0x00 0x00 эквивалентны.

А вот почему он сразу не ругался - это вопрос... Версия сервера?

Роман

Ответить