Problème avec la taille maximale des lignes dans MySQL

8

J'ai un problème avec MySQL, j'ai une table avec de nombreux champs de texte. Lorsque j'essaie de stocker des données, j'obtiens cette erreur.

Taille de ligne trop grande. La taille de ligne maximale pour le type de table utilisé, sans compter les BLOBs, est 8126. Vous devez changer certaines colonnes en TEXT ou BLOBs

Le texte que je stocke dans chaque champ n'est pas trop long, seulement quelques paragraphes dans chacun.

Que puis-je faire?

Memochipan
la source

Réponses:

9

Merci pour les personnes qui ont répondu. Les liens que vous avez publiés étaient une base très utile pour commencer à apprendre.

Enfin j'ai trouvé cette page: http://download.oracle.com/docs/cd/E17952_01/refman-5.5-en/innodb-compression-usage.html

Et j'ai configuré my.cnf en ajoutant ces deux lignes dans la [mysqld]section:

innodb_file_per_table
innodb_file_format = Barracuda

Ensuite, j'ai ALTERma table avec cette commande via phpMyAdmin:

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

Il est également possible d'utiliser d'autres paramètres que vous pouvez lire dans le lien ci-dessus, mais ceux-ci ont bien fonctionné pour moi.

Memochipan
la source
Je n'ai pas trouvé beaucoup d'informations sur les inconvénients de COMPRESSED et Barracuda. Pourquoi ne pas toujours l'utiliser si c'est mieux et résoudre ce problème?
Ted
3

Vous voudrez peut-être jeter un œil à cet article qui explique beaucoup de choses sur les tailles de ligne MySQL. Il est important de noter que même si vous utilisez des champs TEXT ou BLOB, la taille de votre ligne peut toujours dépasser 8 Ko (limite pour InnoDB) car elle stocke les 768 premiers octets pour chaque champ en ligne dans la page. Le moyen le plus simple de résoudre ce problème consiste à utiliser le format de fichier Barracuda avec InnoDB. Cela élimine fondamentalement le problème en stockant uniquement le pointeur de 20 octets sur les données de texte au lieu de stocker les 768 premiers octets.

Kibbee
la source
1

Eh bien, faites comme mysql le dit: convertissez les grands champs de varchar en texte ou en blob (ALTER TABLE). les champs de texte se comportent un peu comme varchar (les index nécessitent une longueur de préfixe, mais fonctionnent néanmoins), mais sont stockés séparément.

Cette référence vous indique les limites exactes de chaque moteur de table mysql d'origine:

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

Et voici tout ce qu'il faut savoir sur les champs de texte:

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

korkman
la source
Merci @korkman pour votre réponse, mes champs étaient déjà définis comme du texte lorsque le problème est survenu. Je vais regarder vos suggestions de liens.
Memochipan
0

Surtout la publication croisée de Stack Overflow , mais il s'agit d' un bogue ouvert (et vérifié) dans le moteur InnoDB du serveur MySQL . Un correctif temporaire pour l'instant consiste à recourir au moteur MyISAM en tant que stockage temporaire. Donc, dans votre fichier my.cnf:

internal_tmp_disk_storage_engine=MyISAM
hjpotter92
la source