Spec-Zone .ru
спецификации, руководства, описания, API
|
Есть жесткий предел 4096 столбцов за таблицу, но эффективный максимум может быть меньше для данной таблицы. Точный предел зависит от нескольких взаимодействующих факторов.
У каждой таблицы (независимо от механизма хранения) есть максимальный размер строки 65 535 байтов. Механизмы хранения могут поместить дополнительные ограничения на этот предел, уменьшая эффективный максимальный размер строки.
Максимальный размер строки ограничивает число (и возможно размер) столбцов, потому что полная длина
всех столбцов не может превысить этот размер. Например, utf8
символы
требуют до трех байтов за символ, таким образом, для a CHAR(255) CHARACTER SET utf8
столбец, сервер должен выделить 255
× 3 = 765 байтов за значение. Следовательно, таблица не может содержать больше чем 65 535 / 765 = 85
таких столбцов.
Хранение для столбцов переменной длины включает байты длины, которые оцениваются против размера
строки. Например, a VARCHAR(255)
CHARACTER SET utf8
столбец берет два байта, чтобы сохранить длину значения, таким
образом, каждое значение может взять до 767 байтов.
BLOB
и TEXT
столбцы рассчитывают от один до четыре плюс восемь байтов каждый
к пределу размера строки, потому что их содержание сохранено отдельно от остальной части строки.
Объявление столбцов NULL
может уменьшить максимальное количество
разрешенных столбцов. Для MyISAM
таблицы, NULL
столбцы
требуют, чтобы дополнительное пространство в строке записало, являются ли их значения NULL
. Каждый NULL
столбец берет один
бит, дополнительный, окруженный к самому близкому байту. Максимальная длина строки в байтах может
быть вычислена следующим образом:
row length = 1 + (sum of column lengths
) + (number of NULL columns
+delete_flag
+ 7)/8 + (number of variable-length columns
)
delete_flag
1 для таблиц со статическим форматом строки.
Статические таблицы используют немного в записи строки для флага, который указывает, была ли строка
удалена. delete_flag
0 для динамических таблиц, потому что
флаг сохранен в динамическом заголовке строки. Для получения информации о MyISAM
форматы таблицы, см. Раздел
14.3.3,"MyISAM
Табличные Форматы Хранения".
Для InnoDB
таблицы,
размер хранения является тем же самым для NULL
и NOT
NULL
столбцы, таким образом, предыдущие вычисления не применяются.
Следующий оператор, чтобы составить таблицу t1
успешно выполняется,
потому что столбцы требуют 32 765 + 2 байта и 32 766 + 2 байта, который находится в пределах
максимального размера строки 65 535 байтов:
mysql>CREATE TABLE t1
->(c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
->ENGINE = MyISAM CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
Следующий оператор, чтобы составить таблицу t2
сбои, потому что столбцы
NULL
и MyISAM
требует дополнительного пространства, которое заставляет
размер строки превышать 65 535 байтов:
mysql>CREATE TABLE t2
->(c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)
->ENGINE = MyISAM CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for theused table type, not counting BLOBs, is 65535. You have to change somecolumns to TEXT or BLOBs
Следующий оператор, чтобы составить таблицу t3
сбои, потому что, хотя
длина столбца в пределах максимальной длины 65 535 байтов, два дополнительных байта обязаны
записывать длину, которая заставляет размер строки превышать 65 535 байтов:
mysql>CREATE TABLE t3
->(c1 VARCHAR(65535) NOT NULL)
->ENGINE = MyISAM CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for theused table type, not counting BLOBs, is 65535. You have to change somecolumns to TEXT or BLOBs
Сокращение длины столбца к 65 533 или меньше разрешениям оператор, чтобы успешно выполниться.
Отдельные механизмы хранения могли бы ввести дополнительные ограничения то предельное количество столбца таблицы. Примеры:
InnoDB
разрешения до 1000 столбцов.
InnoDB
ограничивает размер строки чем-то меньше чем половина
страницы базы данных (приблизительно 8000 байтов), не включая VARBINARY
, VARCHAR
, BLOB
, или TEXT
столбцы.
Отличающийся InnoDB
форматы хранения (COMPRESSED
, REDUNDANT
) используйте
различное количество верхнего колонтитула страницы и данных метки конца, которые влияют на
количество хранения, доступного для строк.
Каждая таблица имеет .frm
файл, который содержит
табличное определение. Определение влияет на контент этого файла способами, которые могут влиять на
число столбцов, разрешенных в таблице. Для получения дополнительной информации см. Раздел
E.10.5, "Пределы, Наложенные .frm
Файловая структура".