Spec-Zone.ru › MySQL 5.7

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 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 позволяет избежать ограничения размера строки 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_size 4КБ, 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/column-count-limit.html

Spec-Zone.ru

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