8.4.7 Ограничения на количество столбцов таблицы и размер строки
В этом разделе описаны ограничения на количество столбцов в таблицах и размер отдельных строк.
Ограничения на количество столбцов
MySQL имеет жёсткое ограничение в 4096 столбцов на таблицу, но эффективное максимальное значение может быть меньше для данной таблицы. Точное ограничение на количество столбцов зависит от нескольких факторов:
Максимальный размер строки таблицы ограничивает количество (и, возможно, размер) столбцов, поскольку общая длина всех столбцов не должна превышать этот размер. См. Ограничения на размер строки.
Требования к хранению отдельных столбцов ограничивают количество столбцов, которые могут поместиться в заданный максимальный размер строки. Требования к хранению некоторых типов данных зависят от таких факторов, как движок хранения, формат хранения и наборы символов. См. Раздел 11.7, «Требования к хранению типов данных».
Движки хранения могут накладывать дополнительные ограничения, которые ограничивают количество столбцов в таблице. Например,
InnoDBимеет ограничение в 1017 столбцов на таблицу. См. Раздел 14.23, «Ограничения InnoDB». Для получения информации о других движках хранения см. Главу 15, Альтернативные движки хранения.Каждая таблица имеет файл
.frm, который содержит определение таблицы. Определение влияет на содержимое этого файла, что может повлиять на количество разрешённых столбцов в таблице. См. Ограничения, накладываемые структурой файла .frm.
Ограничения на размер строки
Максимальный размер строки для данной таблицы определяется несколькими факторами:
Внутреннее представление таблицы MySQL имеет максимальный размер строки 65 535 байт, даже если движок хранения может поддерживать строки большего размера.
BLOBиTEXTстолбцы вносят вклад в предел размера строки лишь на 9–12 байт, так как их содержимое хранится отдельно от остальной части строки.-
Максимальный размер строки для таблицы
InnoDB, который применяется к данным, хранящимся локально в странице базы данных, немного меньше половины страницы для 4КБ, 8КБ, 16КБ и 32КБinnodb_page_sizeнастроек. Например, максимальный размер строки немного меньше 8КБ при стандартном 16КБInnoDBразмере страницы. Для страниц 64КБ максимальный размер строки немного меньше 16КБ. См. Раздел 14.23, «Ограничения InnoDB».Если строка, содержащая данные, превышает максимальный размер строки
InnoDB,InnoDBвыбирает столбцы переменной длины для внешнего хранения вне страницы, пока строка не поместится вInnoDBограничение размера строки. Количество данных, хранящихся локально для столбцов переменной длины, которые хранятся вне страницы, отличается в зависимости от формата строки. Для получения дополнительной информации см. Раздел 14.11, «Форматы строк InnoDB». -
Разные форматы хранения используют разные объёмы заголовка и трейлера страницы, что влияет на объём памяти, доступный для строк.
Для получения информации о форматах строк
InnoDBсм. Раздел 14.11, «Форматы строк InnoDB».Для получения информации о форматах хранения
MyISAMсм. Раздел 15.2.3, «Форматы хранения таблиц MyISAM».
Примеры ограничения размера строки
-
Максимальное ограничение размера строки MySQL в 65 535 байт демонстрируется в следующих
InnoDBиMyISAMпримерах. Ограничение применяется независимо от движка хранения, даже если движок может поддерживать строки большего размера.mysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsmysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsВ следующем
MyISAMпримере изменение столбца наTEXTпозволяет избежать ограничения размера строки в 65 535 байт и допускает успешное выполнение операции, потому что столбцыBLOBиTEXTвносят вклад лишь на 9–12 байт в размер строки.mysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec)Операция выполняется успешно для таблицы
InnoDB, потому что изменение столбца наTEXTпозволяет избежать ограничения размера строки MySQL в 65 535 байт, аInnoDBвнешнее хранение столбцов переменной длины предотвращаетInnoDBограничение размера строки.mysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec) -
Хранение для столбцов переменной длины включает байты длины, которые учитываются в размере строки. Например, столбец
VARCHAR(255) CHARACTER SET utf8mb3занимает два байта для хранения длины значения, поэтому каждое значение может занимать до 767 байт.Запрос на создание таблицы
t1выполняется успешно, потому что столбцам требуется 32 765 + 2 байта и 32 766 + 2 байта, что находится в пределах максимального размера строки 65 535 байт:mysql>
CREATE TABLE t1(c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)ENGINE = InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec)Запрос на создание таблицы
t2завершается неудачно, потому что, хотя длина столбца находится в пределах максимальной длины 65 535 байт, требуются ещё два байта для записи длины, что приводит к превышению размера строки 65 535 байт:mysql>
CREATE TABLE t2(c1 VARCHAR(65535) NOT NULL)ENGINE = InnoDB CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsСокращение длины столбца до 65 533 или меньше позволяет успешно выполнить запрос.
mysql>
CREATE TABLE t2(c1 VARCHAR(65533) NOT NULL)ENGINE = InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.01 sec) -
Для таблиц
MyISAM, столбцыNULLтребуют дополнительного места в строке для записи того, являются ли их значенияNULL. Каждый столбецNULLзанимает один дополнительный бит, округлённый до ближайшего байта.Запрос на создание таблицы
t3завершается неудачно, потому чтоMyISAMтребует места дляNULLстолбцов в дополнение к месту, необходимому для байтов длины столбцов переменной длины, что приводит к превышению размера строки 65 535 байт:mysql>
CREATE TABLE t3(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 the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsДля получения информации о хранении столбцов
InnoDBв движке храненияNULLсм. Раздел 14.11, «Форматы строк InnoDB». -
InnoDBограничивает размер строки (для данных, хранящихся локально в странице базы данных) до немного меньше половины страницы базы данных для настроекinnodb_page_size4КБ, 8КБ, 16КБ и 32КБ и до немного меньше 16КБ для страниц 64КБ.Запрос на создание таблицы
t4завершается неудачно, потому что определённые столбцы превышают ограничение размера строки для 16КБInnoDBстраницы.mysql>
CREATE TABLE t4 (c1 CHAR(255),c2 CHAR(255),c3 CHAR(255),c4 CHAR(255),c5 CHAR(255),c6 CHAR(255),c7 CHAR(255),c8 CHAR(255),c9 CHAR(255),c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),c22 CHAR(255),c23 CHAR(255),c24 CHAR(255),c25 CHAR(255),c26 CHAR(255),c27 CHAR(255),c28 CHAR(255),c29 CHAR(255),c30 CHAR(255),c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET latin1;ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
© 2025 Oracle
Licensed under the GPLv2 License.