Spec-Zone.ru › MySQL 9.2

10.4.7 Ограничения на количество столбцов таблицы и размер строки

В этом разделе описываются ограничения на количество столбцов в таблицах и размер отдельных строк.

  • Ограничения на количество столбцов

  • Ограничения на размер строки

Ограничения на количество столбцов

MySQL имеет жесткое ограничение в 4096 столбцов на таблицу, но эффективное максимальное значение может быть меньше для данной таблицы. Точное ограничение на количество столбцов зависит от нескольких факторов:

  • Максимальный размер строки для таблицы ограничивает количество (и, возможно, размер) столбцов, так как общая длина всех столбцов не может превышать этот размер. См. Ограничения на размер строки.

  • Требования к хранению отдельных столбцов ограничивают количество столбцов, которые помещаются в заданный максимальный размер строки. Требования к хранению для некоторых типов данных зависят от таких факторов, как движок хранения, формат хранения и кодовая страница. См. Раздел 13.7, «Требования к хранению типов данных».

  • Движки хранения могут накладывать дополнительные ограничения, которые ограничивают количество столбцов в таблице. Например, InnoDB имеет ограничение в 1017 столбцов на таблицу. См. Раздел 17.21, «Ограничения InnoDB». Сведения об других движках хранения см. в Главе 18, Альтернативные движки хранения.

  • Функциональные части ключей (см. Раздел 15.1.15, «Выполнение CREATE INDEX») реализуются как скрытые виртуальные сгенерированные хранимые столбцы, поэтому каждая функциональная часть ключа в индексе таблицы учитывается при ограничении на общее количество столбцов в таблице.

Ограничения на размер строки

Максимальный размер строки для данной таблицы определяется несколькими факторами:

  • Внутреннее представление таблицы MySQL имеет максимальный размер строки 65 535 байт, даже если движок хранения способен поддерживать строки большего размера. BLOB и TEXT столбцы вносят вклад в предел размера строки только в 9–12 байтах, так как их содержимое хранится отдельно от остальной части строки.

  • Максимальный размер строки для таблицы InnoDB, который применяется к данным, хранящимся локально в странице базы данных, немного меньше половины страницы для значений 4 КБ, 8 КБ, 16 КБ и 32 КБ innodb_page_size настроек. Например, максимальный размер строки немного меньше 8 КБ для значения по умолчанию 16 КБ InnoDB размера страницы. Для страниц 64 КБ максимальный размер строки немного меньше 16 КБ. См. Раздел 17.21, «Ограничения InnoDB».

    Если строка, содержащая превышает максимальный размер строки InnoDB, InnoDB выбирает столбцы переменной длины для внешнего хранения вне страницы, пока строка не поместится в предел размера строки InnoDB. Количество данных, хранящихся локально для столбцов переменной длины, хранящихся вне страницы, отличается в зависимости от формата строки. Дополнительную информацию см. в Разделе 17.10, «Форматы строк InnoDB».

  • Разные форматы хранения используют разные объемы заголовка и концевой информации страницы, что влияет на объем хранилища, доступного для строк.

    • Дополнительную информацию о форматах строк InnoDB см. в Разделе 17.10, «Форматы строк InnoDB».

    • Дополнительную информацию о форматах хранения MyISAM см. в Разделе 18.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 BLOBs
    
    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=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 позволяет избежать ограничения размера строки в 65 535 байт MySQL, а 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 см. в Разделе 17.10, «Форматы строк InnoDB».

  • InnoDB ограничивает размер строки (для данных, хранящихся локально на странице базы данных) значением, немного меньшим половины страницы базы данных для значений 4 КБ, 8 КБ, 16 КБ и 32 КБ innodb_page_size настроек и немного меньше 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=DYNAMIC DEFAULT CHARSET latin1;
    ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help.
    In current row format, BLOB prefix of 0 bytes is stored inline.
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/column-count-limit.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API