Кузнецов Евгений wrote:

Хорошо, попробуем выйти за эти пределы

create table table12
(value2 VARCHAR(32763),
 value1 VARCHAR(32765)
)

возвращает
unsuccessful metadata update.
new record size of 65537 bytes is too big.
TABLE TABLE12.

32763 + 32765 + 2 + 2 (длина поля VARCHAR) = 65532

Что же хранится в остальных 5?

Маска NULL-ов в начале каждой записи - не менее 4 байт. И один байт тратится впустую, т.к. варчары должны быть выравнены на двухбайтную границу.

create table table12
(value2 VARCHAR(32762),
 value1 VARCHAR(32765)
)

создать удается.

Второй варчар оказывается уже выравненным, ничего не тратится.

Переставим в объявлении столбцы местами:

create table table13
( value1 VARCHAR(32765),
  value2 VARCHAR(32762)
 )

unsuccessful metadata update.
new record size of 65536 bytes is too big.
TABLE TABLE13.

См. выше.

Методом проб удалось создать
create table table13
(value1 VARCHAR(32765),
 value2 VARCHAR(32761))

Интересно, правда?

Неа :-)

Пытаемся выбрать данные из пустой таблицы

select * from table13 или
select value1,value2 from table13

Получаем ошибку
Dynamic SQL Error.
SQL error code = -204.
Implementation limit exceeded.
block size exceeds implementation restriction.

Во-первых, в буфере место под нуллы по-другому выделяется. Вместо битовой маски к каждому полю добавляется 2-х байтный флаг. Во-вторых, на клиента всегда тянется дополнительная инфа - record version, db_key.

Обратите внимание: при перестановке полей длина буфера снова изменяется.

Дык выравнивание.

Также непонятно, почему выходной буфер меньше, чем реально хранимые данные.

См. выше.


--
Дмитрий Еманов

Ответить