Equivalente a varchar (max) no MySQL?

170

Qual é o equivalente a varchar (max) no MySQL?

David Basarab
fonte

Respostas:

195

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) CHARACTER SET utf8

aqui estão alguns exemplos:

O tamanho máximo da linha é 65535, mas um varchar também inclui um byte ou dois para codificar o comprimento de uma determinada sequência. Portanto, você realmente não pode declarar um varchar do tamanho máximo da linha, mesmo que seja a única coluna na tabela.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Mas se tentarmos diminuir comprimentos, encontraremos o maior comprimento que funciona:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Agora, se tentarmos usar um conjunto de caracteres multibyte no nível da tabela, descobrimos que ele conta cada caractere como vários bytes. As strings UTF8 não usam necessariamente vários bytes por string, mas o MySQL não pode assumir que você restringirá todas as suas inserções futuras a caracteres de byte único.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Apesar do que o último erro nos disse, o InnoDB ainda não gosta de um comprimento de 21845.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Isso faz todo o sentido, se você calcular 21845 * 3 = 65535, o que não teria funcionado de qualquer maneira. Considerando 21844 * 3 = 65532, o que funciona.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
Bill Karwin
fonte
20
Eu também sugeriria o uso de TEXT
Adi
2
@AdnanShammout: Claro, a menos que você queira declarar um DEFAULTvalor para a coluna. Não é possível fazer isso com os tipos TEXT ou BLOB.
Bill Karwin
5
@ DanW, o TEXTlimite de comprimento é de 64 K. MEDIUMTEXTlimite de comprimento é 16M. LONGTEXTlimite de comprimento é 4G.
Bill Karwin
4
O maior problema com isto é que se você criar uma coluna do mesmo tamanho, você pode ter apenas que uma coluna na tabela. O tamanho máximo da linha no MySql é 64k, portanto, se você possui uma coluna de 64k, é tudo o que obtém. Essa mesma restrição não se aplica ao varchar(max)tipo de coluna do Sql Server .
joshperry
1
@joshperry, sim, mas as colunas TEXT / BLOB contam apenas uma pequena quantidade (9-12 bytes) em direção ao limite de tamanho de linha de 64 KB, portanto, se você precisar de um VARCHAR grande e de várias outras colunas, é melhor usar o TEXT.
Bill Karwin
74

TLDR; O MySql não possui um conceito equivalente varchar(max), este é um recurso do MS SQL Server.

O que é VARCHAR (máx)?

varchar(max) é um recurso do Microsoft SQL Server.

A quantidade de dados que uma coluna poderia armazenar nas versões do Microsoft SQL Server anteriores à versão 2005 era limitada a 8 KB. Para armazenar mais de 8 KB, você teria que usar TEXT, NTEXTou BLOBtipos de colunas, esses tipos de colunas armazenavam seus dados como uma coleção de 8K páginas separadas das páginas de dados da tabela; eles suportaram o armazenamento de até 2 GB por linha.

A grande limitação a estes tipos de colunas foi que eles geralmente necessária funções especiais e declarações de acessar e modificar os dados (por exemplo READTEXT, WRITETEXTe UPDATETEXT)

No SQL Server 2005, varchar(max)foi introduzido para unificar os dados e as consultas usadas para recuperar e modificar dados em colunas grandes. Os dados para varchar(max)colunas são armazenados em linha com as páginas de dados da tabela.

Como os dados na coluna MAX preenchem uma página de dados de 8 KB, uma página excedente é alocada e a página anterior aponta para ela, formando uma lista vinculada. Ao contrário TEXT, NTEXTe BLOBo varchar(max)tipo de coluna suporta todos os mesmos semântica da consulta como outros tipos de colunas.

Então, varchar(MAX)realmente significa varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)e não varchar(MAX_SIZE_OF_A_COLUMN).

O MySql não possui um idioma equivalente.

Para obter a mesma quantidade de armazenamento que varchar(max)no MySql, você ainda precisará recorrer a um BLOBtipo de coluna. Este artigo discute um método muito eficaz de armazenar grandes quantidades de dados no MySql com eficiência.

joshperry
fonte
1
Isso tem mais a ver com o SQL Server do que o MySQL.
8261 Kermit
14
@njk Sim, mas para explicar o que o "equivalente" no MySql (ou a falta de equivalente nesse caso) exigia descrever exatamente o que varchar(max) realmente significa.
joshperry
29

O comprimento máximo de um varchar é

65535

dividido pelo comprimento máximo de bytes de um caractere no conjunto de caracteres em que a coluna está definida (por exemplo, utf8 = 3 bytes, ucs2 = 2, latin1 = 1).

menos 2 bytes para armazenar o comprimento

menos o comprimento de todas as outras colunas

menos 1 byte para cada 8 colunas que são anuláveis. Se sua coluna for nula / não nula, isso será armazenado como um bit em um byte / bytes chamado máscara nula, 1 bit por coluna que é anulável.

ʞɔıu
fonte
I como o formato de sua resposta, mas ele parece estar faltando alguma informação útil que a resposta superior fornece a respeito charsets e outras coisas
Joe Phillips
3

Para SQL Server

alterar tabela prg_ar_report_colors add Text_Color_Code VARCHAR (max);

Para MySql

alterar tabela prg_ar_report_colors add Text_Color_Code longtext;

Para Oracle

alterar tabela prg_ar_report_colors adicionar Text_Color_Code CLOB;

Dinanath Parit
fonte
1
observe que texto longo, texto e blob são armazenados de maneira diferente do varchar. O varchar é armazenado com os outros campos, enquanto o texto é armazenado em um arquivo separado no servidor. ele tem prós e contras tão cuidadoso qual escolher
santiago Arizti
0

Mysql Convertendo coluna de VARCHAR para TEXT quando estiver abaixo do tamanho limite !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>
zloctb
fonte
-11

O comprimento máximo de um varchar no MySQL 5.6.12 é 4294967295.

ajabep
fonte