MySQL 8,0 длина строки (8,126 против 65,535) - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь создать широкую таблицу, которая будет использоваться для импорта данных перед очисткой. Он имеет 221 столбец типа varchar(90), Innodb с использованием Latin1.

Когда я пытаюсь создать его, я получаю сообщение об ошибке Error Code: 1118. Row size too large (> 8126). Changing some columns to TEXT or BLOB may help.

Но в онлайн-справке указано, что максимальное значение составляет 65 355 . На самом деле, если я попробую более простой оператор create в качестве теста (см. Ниже), я получаю другое сообщение об ошибке: Error Code: 1118. Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.

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;

Почему я получаю разные сообщения об ошибках, которые, кажется, указывают разная максимальная длина строки?

Ответы [ 2 ]

3 голосов
/ 28 мая 2020

Архитектура MySQL поддерживает подключаемые механизмы хранения. Это означает, что существуют ограничения как на уровне SQL, так и на уровне механизма хранения.

Ограничение размера 8126 находится в механизме хранения InnoDB. Это предел размера строки, если вы используете InnoDB. Предел размера строки 65355 находится на уровне SQL, поэтому независимо от того, какой механизм хранения вы используете, кроме InnoDB, он будет поддерживать только строки размером не более 65355 байт (за исключением BLOB / TEXT).

Вы возможно, вы сможете установить вашу таблицу InnoDB в ROW_FORMAT = DYNAMI C. Это меняет способ хранения VARCHAR / BLOB / TEXT, и вы сможете хранить таким образом больше столбцов.

Но я настоятельно рекомендую вам пересмотреть дизайн таблицы с 200+ столбцами varchar независимо от того, какой механизм хранения ты используешь. Это действительно похоже на то, что вы не практиковали хорошую нормализацию для своего дизайна.

2 голосов
/ 28 мая 2020

У вас есть 2 ограничения:

  • Максимальный размер строки MySQL, который составляет 65 535

    Максимальный размер строки MySQL составляет 65 535 байт демонстрируется в следующих примерах InnoDB и MyISAM. Ограничение применяется независимо от механизма хранения, даже если механизм хранения может поддерживать строки большего размера.

  • Максимальный размер строки InnoDB, который составляет половину размера страницы ( по умолчанию 16 КБ)

    InnoDB ограничивает размер строки (для данных, хранящихся локально на странице базы данных) чуть менее половины страницы базы данных для настроек innodb_page_size 4 КБ, 8 КБ, 16 КБ и 32 КБ, и чуть меньше чем 16 КБ для страниц размером 64 КБ.

MySQL сначала проверяет глобальное ограничение, а затем ограничения двигателя, так как механизм имеет такой же или меньший максимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...