Problema com tamanho máximo de linha no MySQL

8

Eu tenho um problema com o MySQL, tenho uma tabela com muitos campos de texto. Quando tento armazenar alguns dados, obtenho esse erro.

Tamanho da linha muito grande. O tamanho máximo da linha para o tipo de tabela usado, sem contar os BLOBs, é 8126. É necessário alterar algumas colunas para TEXT ou BLOBs

O texto que eu guardo em cada campo não é muito longo, apenas alguns parágrafos em cada um.

O que eu posso fazer?

Memochipan
fonte

Respostas:

9

Obrigado pelas pessoas que respondem. Os links que você postou foram uma base muito útil para começar a aprender.

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

E eu configurei my.cnf adicionando essas duas linhas na [mysqld]seção:

innodb_file_per_table
innodb_file_format = Barracuda

Então eu ALTERminha tabela com este comando através do phpMyAdmin:

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

Também é possível usar outras configurações que você pode ler no link acima, mas elas funcionaram bem para mim.

Memochipan
fonte
Não encontrei muita informação sobre a desvantagem de COMPRESSED e Barracuda. Por que nem sempre usar isso se isso é melhor e resolve isso?
Ted
3

Você pode dar uma olhada neste artigo, que explica muito sobre o tamanho das linhas do MySQL. É importante observar que, mesmo se você usar campos TEXT ou BLOB, o tamanho da sua linha ainda poderá ser superior a 8K (limite para o InnoDB) porque ele armazena os primeiros 768 bytes para cada campo embutido na página. A maneira mais simples de corrigir isso é usar o formato de arquivo Barracuda com o InnoDB. Isso basicamente elimina completamente o problema armazenando apenas o ponteiro de 20 bytes nos dados de texto em vez de armazenar os primeiros 768 bytes.

Kibbee
fonte
1

Bem, faça como o mysql diz: converta grandes campos de varchar em texto ou blob (ALTER TABLE). os campos de texto se comportam de maneira semelhante ao varchar (os índices precisam do tamanho do prefixo, mas, no entanto, funcionam), mas são armazenados separadamente.

Esta referência informa os limites exatos de cada mecanismo de tabela mysql padrão:

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

E aqui está tudo a saber sobre os campos de texto:

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

korkman
fonte
Obrigado @korkman pela sua resposta, meus campos já estavam definidos como texto quando o problema ocorreu. Vou assistir suas sugestões de links.
Memochipan
0

Principalmente postagem cruzada do Stack Overflow , mas esse é um bug aberto (e verificado) no mecanismo InnoDB do servidor MySQL . Uma correção temporária no momento é fazer o fallback para o mecanismo MyISAM como armazenamento temporário. Então, no seu arquivo my.cnf:

internal_tmp_disk_storage_engine=MyISAM
hjpotter92
fonte