Кузнецов Евгений 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.
Обратите внимание: при перестановке полей длина буфера снова изменяется.
Дык выравнивание.
Также непонятно, почему выходной буфер меньше, чем реально хранимые данные.
См. выше. -- Дмитрий Еманов

