Je fais face au problème suivant.
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In
format de ligne actuel, le préfixe BLOB de 768 octets est stocké en ligne.
Il apparaît juste lorsque je télécharge une image dans la base de données (elle a <1 Mo). Précisément, seulement 100 Ko.
J'ai essayé beaucoup de choses: changer les propriétés "max_allowed_packet", "innodb_log_file_size" (à savoir, augmenter la taille à 512M) et rien ...
Je ne connais pas la cause du problème.
Pour illustrer, le tableau
TABLE(
`passeio` int(4) unsigned NOT NULL COMMENT 'identitificador do passeio',
`data_inclusao` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`nome_passeio` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`inicio` date NOT NULL,
`fim` date NOT NULL,
`por_que_ir` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`pdf_roteiro` mediumblob NOT NULL,
`incluso` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`nao_incluso` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`valor_descricao` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`valor_Vista` decimal(10,0) NOT NULL,
`valor_total_parcelado` decimal(10,0) NOT NULL,
`numero_parcelas` int(2) unsigned NOT NULL,
`forma_pagamento` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`avisos_importantes` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`foto_principal` blob NOT NULL,
`foto_2` blob NOT NULL,
`foto_3` blob NOT NULL,
`foto_4` blob NOT NULL,
`foto_5` blob NOT NULL,
`foto_6` blob NOT NULL,
`foto_7` blob NOT NULL,
`foto_8` blob NOT NULL,
`foto_9` blob NOT NULL,
`foto_10` blob NOT NULL,
`foto_11` blob NOT NULL,
`foto_12` blob NOT NULL,
`foto_13` blob NOT NULL,
`foto_14` blob NOT NULL,
`foto_15` blob NOT NULL,
`foto_16` blob NOT NULL,
`foto_17` blob NOT NULL,
`foto_18` blob NOT NULL,
`foto_19` blob NOT NULL,
`foto_20` mediumblob NOT NULL,
`valor_entrada` decimal(10,0) NOT NULL,
`data_partida` date NOT NULL,
`local_partida_1` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`hora_partida_1` time NOT NULL,
`local_partida_2` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`hora_partida_2` time NOT NULL,
`local_partida_3` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`hora_partida_3` time NOT NULL,
`local_partida_4` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`hora_partida_4` time NOT NULL,
`local_partida_5` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`hora_partida_5` time NOT NULL,
`local_partida_6` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`hora_partida_6` time NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Bill Karwin a déjà abordé ce sujet dans sa réponse à Erreur de taille de ligne avec MySQL
J'ai également abordé ce sujet dans le passé: MySQL: taille de ligne trop grande (> 8126)
Sur la base de son message et du fait que vous avez encore plusieurs champs TEXT et VARCHAR, vous devez définir les valeurs suivantes plus haut dans my.cnf
:
[mysqld]
max_allowed_packet = 1G
innodb_log_file_size = 2G
innodb_log_buffer_size = 512M
Ensuite, redémarrez mysqld.
Votre commentaire
En désespoir de cause, j'ai effacé hier toutes les colonnes de blobs. Je n'en ai laissé qu'un. Le problème a disparu. Mais je vais les recréer et j'essaierai votre approche. Dès que possible je reviens avec le résultat. Merci pour l'indication
Vous ne devez pas mettre 20 BLOB dans une table. Vous devez créer une table pour contenir les BLOBs
CREATE TABLE mi_fotos
(
id INT NOT NULL AUTO_INCREMENT,
passeio INT NOT NULL,
foto BLOB,
PRIMARY KEY (id)
) ENGINE=InnoDB;
Stockez vos photos dans ce tableau et ayez passeio dans ce lien vers votre tableau d'origine.
J'essayais de charger un fichier de vidage et je suis tombé dessus. Il échouait sur un CREATE TABLE
déclaration.
J'ai pu au moins obtenir le CREATE TABLE
instruction à exécuter en définissant
innodb_strict_mode = 0
Cela transformera cette erreur en avertissement. Lors du chargement du vidage, cette erreur s'est répétée deux fois, mais la table a été créée avec tous les champs:
[Warning] InnoDB: Cannot add field `field_GF20140210120838544997000000` in table `mydb`.`mytable` because after adding it, the row size is 7391 which is greater than maximum allowed size (7372) for a record on index leaf page.
Contrairement à l'avertissement, le champ field_GF20140210120838544997000000
existe.
Je manque probablement des données localement, mais au moins la refactorisation est une possibilité maintenant que je les ai chargées.