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

8

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

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

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

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

Memochipan
источник

Ответы:

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;

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

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

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

Kibbee
источник
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 за ваш ответ, мои поля уже были определены как текст, когда возникла проблема. Я собираюсь посмотреть ваши ссылки предложения.
Мемочипан
0

В основном кросс-постинг из Stack Overflow , но это открытая (и проверенная) ошибка в движке InnoDB сервера MySQL . Временное исправление на данный момент - возврат к движку MyISAM в качестве временного хранилища. Итак, в вашем файле my.cnf:

internal_tmp_disk_storage_engine=MyISAM
hjpotter92
источник