Problema con el tamaño máximo de fila en MySQL

8

Tengo un problema con MySQL, tengo una tabla con muchos campos de texto. Cuando trato de almacenar algunos datos obtengo este error.

Tamaño de fila demasiado grande. El tamaño máximo de fila para el tipo de tabla utilizado, sin contar BLOB, es 8126. Debe cambiar algunas columnas a TEXTO o BLOB

El texto que almaceno en cada campo no es demasiado largo, solo unos pocos párrafos en cada uno.

¿Que puedo hacer?

Memochipan
fuente

Respuestas:

9

Gracias por la gente que responde. Los enlaces que publicó fueron una base muy útil para comenzar a aprender.

Finalmente encontré esta página: http://download.oracle.com/docs/cd/E17952_01/refman-5.5-en/innodb-compression-usage.html

Y configuré my.cnf agregando estas dos líneas en la [mysqld]sección:

innodb_file_per_table
innodb_file_format = Barracuda

Luego, ALTERmi tabla con este comando a través de phpMyAdmin:

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

También es posible usar otras configuraciones que puede leer en el enlace de arriba, pero estas funcionaron bien para mí.

Memochipan
fuente
No encontré mucha información sobre wahts, el inconveniente de COMPRESSED y Barracuda. ¿Por qué no siempre usar eso si eso es mejor y resuelve esto?
Ted
3

Es posible que desee leer este artículo que explica mucho sobre los tamaños de fila de MySQL. Es importante tener en cuenta que incluso si utiliza campos TEXT o BLOB, el tamaño de su fila podría superar los 8K (límite para InnoDB) porque almacena los primeros 768 bytes para cada campo en línea en la página. La forma más sencilla de solucionar esto es usar el formato de archivo Barracuda con InnoDB. Básicamente, esto elimina el problema por completo almacenando solo el puntero de 20 bytes en los datos de texto en lugar de almacenar los primeros 768 bytes.

Kibbee
fuente
1

Bueno, haz lo que dice mysql: convierte grandes campos de varchar a texto o blob (ALTER TABLE). los campos de texto se comportan de manera muy similar a varchar (los índices necesitan una longitud de prefijo, pero funcionan), pero se almacenan por separado.

Esta referencia le indica los límites exactos de cada motor de tabla mysql estándar:

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

Y aquí hay todo lo que debes saber sobre los campos de texto:

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

korkman
fuente
Gracias @korkman por su respuesta, mis campos ya estaban definidos como texto cuando ocurrió el problema. Voy a ver tus sugerencias de enlaces.
Memochipan
0

Principalmente publicación cruzada de Stack Overflow , pero este es un error abierto (y verificado) en el motor InnoDB del servidor MySQL . Una solución temporal por ahora es recurrir al motor MyISAM como almacenamiento temporal. Entonces, en su archivo my.cnf:

internal_tmp_disk_storage_engine=MyISAM
hjpotter92
fuente