Проблема с максимальным размером строки в MySQL


8

У меня проблема с MySQL, у меня есть таблица со многими текстовыми полями. Когда я пытаюсь сохранить некоторые данные, я получаю эту ошибку.

Размер строки слишком велик. Максимальный размер строки для используемого типа таблицы, не считая BLOB, составляет 8126. Некоторые столбцы необходимо изменить на TEXT или BLOB.

Текст, который я храню в каждом поле, не слишком длинный, всего несколько абзацев в каждом.

Что я могу сделать?

Ответы:


9

Спасибо за людей, которые отвечают. Ссылки, которые вы разместили, были очень полезной базой для начала обучения.

Наконец я нашел эту страницу: http://download.oracle.com/docs/cd/E17952_01/refman-5.5-en/innodb-compression-usage.html

И я настроил my.cnf, добавив эти две строки в [mysqld]раздел:

innodb_file_per_table
innodb_file_format = Barracuda

Затем я ALTERмою таблицу с этой командой через phpMyAdmin:

ALTER TABLE nombre_tabla
 ENGINE=InnoDB
 ROW_FORMAT=COMPRESSED 
 KEY_BLOCK_SIZE=8; 
 SHOW WARNINGS;

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


Я не нашел много информации о недостатках для COMPRESSED и Barracuda. Почему бы не всегда использовать это, если это лучше и решает это?
Тед

3

Возможно, вы захотите взглянуть на эту статью, которая многое объясняет о размерах строк MySQL. Важно отметить, что даже если вы используете поля TEXT или BLOB, размер строки все равно может превышать 8 КБ (ограничение для InnoDB), поскольку он хранит первые 768 байт для каждого встроенного поля на странице. Самый простой способ исправить это - использовать формат файла Barracuda с InnoDB. Это в основном полностью избавляет от проблемы, сохраняя только 20-байтовый указатель на текстовые данные вместо 768-байтовых.


1

Что ж, сделайте так, как говорит mysql: конвертируйте большие поля из varchar в текст или BLOB-объекты (ALTER TABLE). текстовые поля ведут себя подобно varchar (для индексов требуется длина префикса, но, тем не менее, они работают), но хранятся отдельно.

Эта ссылка говорит вам точные пределы для каждого движка таблицы mysql:

http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

И вот что нужно знать о текстовых полях:

http://dev.mysql.com/doc/refman/5.0/en/blob.html


Спасибо @korkman за ваш ответ, мои поля уже были определены как текст, когда возникла проблема. Я собираюсь посмотреть ваши ссылки предложения.
Мемочипан

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.