Qual é o tamanho máximo do MySQL VARCHAR?


300

Gostaria de saber qual é o tamanho máximo para um tipo MySQL VARCHAR.

Eu li que o tamanho máximo é limitado pelo tamanho da linha, que é de cerca de 65k. Tentei definir o campo para, varchar(20000)mas ele diz que é muito grande.

Eu poderia configurá-lo para varchar(10000). Qual é o máximo exato que posso definir?


1
Um detalhe blog: goo.gl/Hli6G3
Suresh Kamrushi

Respostas:


293

Lembre-se de que o MySQL tem um limite máximo de tamanho de linha

A representação interna de uma tabela MySQL tem um limite máximo de tamanho de linha de 65.535 bytes, sem contar os tipos BLOB e TEXT. As colunas BLOB e TEXT contribuem apenas de 9 a 12 bytes para o limite de tamanho da linha porque seu conteúdo é armazenado separadamente do restante da linha. Leia mais sobre limites na contagem de colunas da tabela e no tamanho da linha.

O tamanho máximo que uma única coluna pode ocupar é diferente antes e depois do MySQL 5.0.3

Os valores nas colunas VARCHAR são cadeias de comprimento variável. O comprimento pode ser especificado como um valor de 0 a 255 antes do MySQL 5.0.3, e de 0 a 65.535 na 5.0.3 e versões posteriores. O comprimento máximo efetivo de um VARCHAR no MySQL 5.0.3 e posterior está sujeito ao tamanho máximo da linha (65.535 bytes, que é compartilhado entre todas as colunas) e ao conjunto de caracteres usado.

No entanto, observe que o limite é menor se você usar um conjunto de caracteres de bytes múltiplos como utf8 ou utf8mb4.

Use os TEXTtipos inorder para superar o limite de tamanho da linha.

Os quatro tipos de texto são TINYTEXT, TEXT, MEDIUMTEXT e LONGTEXT. Eles correspondem aos quatro tipos de BLOB e têm os mesmos comprimentos máximos e requisitos de armazenamento.

Mais detalhes sobre os tipos BLOB e TEXT

Ainda mais

Confira mais detalhes sobre os Requisitos de armazenamento de tipo de dados, que tratam dos requisitos de armazenamento para todos os tipos de dados.


4
o que é uma string "longa"?
Richard H

6
Eu tento evitar colunas de texto embora como eles podem causar tabelas temporárias a ser criado quando presente e classificação
Robert Swisher

1
Se eu pegar varchar (200) como primeiro nome e armazenar apenas 6 caracteres neste campo, quantos bytes serão ocupados pelo primeiro nome?
Paresh Gami

2
@PareshGami - 6 + 1 = 7 caracteres! Ao contrário de CHAR, os valores VARCHAR são armazenados como um prefixo de 1 ou 2 bytes, além de dados. mais ...
rajukoyilandy 20/08/2015

58

De acordo com os documentos on-line , há um limite de 64 K linhas e você pode determinar o tamanho da linha usando:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Você deve ter em mente que os comprimentos das colunas não são um mapeamento individual do tamanho. Por exemplo, CHAR(10) CHARACTER SET utf8requer três bytes para cada um dos dez caracteres, pois essa codificação específica deve ser responsável pela propriedade de três bytes por caractere utf8(que é a utf8codificação do MySQL em vez de UTF-8 "real", que pode ter até quatro bytes )

Mas, se o tamanho da sua linha chegar aos 64K, convém examinar o esquema do seu banco de dados. É uma tabela rara que precisa ser tão ampla em um banco de dados configurado corretamente (3NF) - é possível, mas não muito comum.

Se você quiser usar mais do que isso, use os tipos BLOBou TEXT. Eles não são contabilizados no limite de 64K da linha (exceto uma pequena área administrativa), mas você precisa estar ciente de outros problemas resultantes do uso deles, como não conseguir classificar usando o bloco de texto inteiro além de um determinado número de caracteres (embora isso possa ser configurado para cima), forçando tabelas temporárias a estar no disco, e não na memória, ou tendo que configurar buffers de comunicação do cliente e do servidor para lidar com os tamanhos com eficiência.

Os tamanhos permitidos são:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Você ainda tem a incompatibilidade de bytes / caracteres (para que uma MEDIUMTEXT utf8coluna possa armazenar "apenas" cerca de meio milhão de caracteres (16M-1)/3 = 5,592,405) , mas ainda assim expande consideravelmente seu alcance.


4
Lembre-se de que os tipos de texto NÃO podem ser armazenados em tabelas de memória; portanto, há uma penalidade de desempenho significativa por usá-los quando um VARCHAR for suficiente.
Camden S.

'a propriedade de três bytes por caractere do utf8' do MySql utf8 , que não é realmente utf8. Na realidade, o max. bytes em um caractere utf-8 é 4 . Por esse motivo, você deve sempre definir a codificação utf8mb4no MySQL . utf8mb4é o nome do MySql para o que o resto da palavra chama utf8.
Stijn de Witt

1
@StijndeWitt, obrigado por isso. esclarecido para indicar que eu quis dizer o método de codificação utf8 do MySQL em vez de UTF-8. Geralmente, uso a variante maiúscula para indicar UTF-8 "real", já que essa é a convenção da IANA aceita.
paxdiablo

41

Fonte

O comprimento máximo de um varchar está sujeito ao tamanho máximo da linha no MySQL, que é de 64 KB (sem contar os BLOBs):

VARCHAR (65535) No entanto, observe que o limite é menor se você usar um conjunto de caracteres de vários bytes:

VARCHAR (21844) CONJUNTO DE PERSONAGENS utf8


20
Pare de usar CHARACTER SET utf8nos exemplos. Deve ser CHARACTER SET utf8mb4(se você quiser todos texto Unicode para ser armazenado adequadamente ... e quem não quer isso?)
Stijn de Witt

4
Para CHARSET=utf8mb4uso VARCHAR(16383).
Wil Moore III

3
O uso de utf8mb4 colocará você contra o limite de largura de índice em uma situação em que utf8 não. Se você examinar os conjuntos de caracteres incluídos no utf8mb4, mas não no utf8, poderá descobrir que incluir todas as várias formas de hieróglifos e outros conjuntos de caracteres arcanos não vale a pena de desempenho significativo (determinado empiricamente). Não é tão cortado e seco quanto Stijn implica.
Krossen

Muitos emojis também estão presentes no utf8mb4 e faltam no utf8, portanto, isso pode mudar a equação de se vale a pena.
Brian Morearty 04/02/19

23

Da documentação do MySQL:

O comprimento máximo efetivo de um VARCHAR no MySQL 5.0.3 e posterior está sujeito ao tamanho máximo da linha (65.535 bytes, que é compartilhado entre todas as colunas) e ao conjunto de caracteres usado. Por exemplo, os caracteres utf8 podem exigir até três bytes por caractere, portanto, uma coluna VARCHAR que usa o conjunto de caracteres utf8 pode ser declarada com no máximo 21.844 caracteres.

Os limites para o VARCHAR variam dependendo do conjunto de caracteres usado. Usar ASCII usaria 1 byte por caractere. Ou seja, você pode armazenar 65.535 caracteres. O uso do utf8 utilizará 3 bytes por caractere, resultando em um limite de 21.844 caracteres. MAS se você estiver usando o moderno multibyte charset utf8mb4 que você deve usar! Ele suporta emojis e outros caracteres especiais. Ele estará usando 4 bytes por caractere. Isso limitará o número de caracteres por tabela para 16.383. Observe que outros campos como INT também serão contados para esses limites.

Conclusão:

utf8 máximo de 21.844 caracteres

utf8mb4 máximo de 16.383 caracteres


6

você também pode usar MEDIUMBLOB / LONGBLOB ou MEDIUMTEXT / LONGTEXT

Um tipo de BLOB no MySQL pode armazenar até 65.534 bytes, se você tentar armazenar mais do que esses dados, o MySQL truncará os dados. MEDIUMBLOB pode armazenar até 16.777.213 bytes e LONGBLOB pode armazenar até 4.294.967.292 bytes.


3

Antes do Mysql versão 5.0.3, o tipo de dados Varchar pode armazenar 255 caracteres, mas a partir do 5.0.3 ele pode armazenar 65.535 caracteres.

MAS ele tem uma limitação do tamanho máximo de linha de 65.535 bytes. Isso significa que, incluindo todas as colunas, ele não deve ter mais que 65.535 bytes.

No seu caso, pode ser que, quando você esteja tentando definir mais de 10000, exceda mais de 65.535 e o mysql dê o erro.

Para mais informações: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog com exemplo: http://goo.gl/Hli6G3


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.