¿Equivalente de varchar (max) en MySQL?

170

¿Cuál es el equivalente de varchar (max) en MySQL?

David Basarab
fuente

Respuestas:

195

La longitud máxima de un varchar está sujeta al tamaño máximo de fila en MySQL, que es 64 KB (sin contar BLOB):

VARCHAR(65535)

Sin embargo, tenga en cuenta que el límite es menor si utiliza un conjunto de caracteres de varios bytes:

VARCHAR(21844) CHARACTER SET utf8

Aquí hay unos ejemplos:

El tamaño máximo de fila es 65535, pero un varchar también incluye un byte o dos para codificar la longitud de una cadena dada. Por lo tanto, en realidad no puede declarar un varchar del tamaño máximo de fila, incluso si es la única columna en la tabla.

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

Pero si intentamos disminuir las longitudes, encontramos la mayor longitud que funciona:

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

Ahora, si tratamos de usar un juego de caracteres multibyte a nivel de tabla, encontramos que cuenta cada carácter como múltiples bytes. Las cadenas UTF8 no necesariamente usan múltiples bytes por cadena, pero MySQL no puede asumir que restringirá todas sus inserciones futuras a caracteres de un solo byte.

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

A pesar de lo que nos dijo el último error, a InnoDB todavía no le gusta una longitud 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

Esto tiene mucho sentido, si calcula que 21845 * 3 = 65535, lo que no habría funcionado de todos modos. Mientras que 21844 * 3 = 65532, que funciona.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
Bill Karwin
fuente
20
También sugiero usar TEXT
Adi
2
@AdnanShammout: Claro, a menos que desee declarar un DEFAULTvalor para la columna. No se puede hacer eso con los tipos TEXT o BLOB.
Bill Karwin
55
@DanW, el TEXTlímite de longitud es de 64K. MEDIUMTEXTEl límite de longitud es de 16M. LONGTEXTEl límite de longitud es 4G.
Bill Karwin el
44
El mayor problema con esto es que si crea una columna de ese tamaño, que sólo puede tener que una columna de la tabla. El tamaño de fila MAX en MySql es de 64k, por lo que si tiene una columna de 64k, eso es todo lo que obtiene. Esta misma restricción no se aplica al varchar(max)tipo de columna del servidor SQL .
joshperry
1
@joshperry, sí, pero las columnas TEXT / BLOB cuentan solo una pequeña cantidad (9-12 bytes) para ese límite de tamaño de fila de 64 KB, por lo que si necesita un VARCHAR grande y varias otras columnas, es mejor usar TEXT.
Bill Karwin
74

TLDR; MySql no tiene un concepto equivalente de varchar(max), esta es una característica de MS SQL Server.

¿Qué es VARCHAR (max)?

varchar(max) es una característica de Microsoft SQL Server.

La cantidad de datos que una columna podía almacenar en las versiones del servidor Microsoft SQL anteriores a la versión 2005 estaba limitada a 8 KB. Para almacenar más de 8 KB, tendría que usar TEXT, NTEXTo BLOBtipos de columnas, estos tipos de columnas almacenaron sus datos como una colección de páginas de 8K separadas de las páginas de datos de la tabla; admitieron almacenar hasta 2 GB por fila.

La gran advertencia para estos tipos de columnas fue que por lo general requieren funciones y declaraciones especiales para acceder y modificar los datos (por ejemplo READTEXT, WRITETEXTy UPDATETEXT)

En SQL Server 2005, varchar(max)se introdujo para unificar los datos y consultas utilizados para recuperar y modificar datos en columnas grandes. Los datos de las varchar(max)columnas se almacenan en línea con las páginas de datos de la tabla.

A medida que los datos en la columna MAX llenan una página de datos de 8 KB, se asigna una página de desbordamiento y la página anterior apunta a ella formando una lista vinculada. A diferencia de TEXT, NTEXTy BLOBel varchar(max)tipo de columna admite la misma semántica de consulta que otros tipos de columna.

Entonces varchar(MAX)realmente significa varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)y no varchar(MAX_SIZE_OF_A_COLUMN).

MySql no tiene un idioma equivalente.

Para obtener la misma cantidad de almacenamiento que varchar(max)en MySql, aún necesitaría recurrir a un BLOBtipo de columna. Este artículo analiza un método muy efectivo para almacenar grandes cantidades de datos en MySql de manera eficiente.

joshperry
fuente
1
Esto tiene más que ver con SQL Server que MySQL.
Kermit
14
@njk Sí, pero para explicar lo que el "equivalente" en MySql (o la falta de un equivalente en este caso) necesitaba describir exactamente lo que varchar(max) realmente significa.
joshperry
29

La longitud máxima de un varchar es

65535

dividido por la longitud máxima de bytes de un carácter en el conjunto de caracteres en el que se establece la columna (por ejemplo, utf8 = 3 bytes, ucs2 = 2, latin1 = 1).

menos 2 bytes para almacenar la longitud

menos la longitud de todas las otras columnas

menos 1 byte por cada 8 columnas que son anulables. Si su columna es nula / no nula, esto se almacena como un bit en un byte / bytes llamado máscara nula, 1 bit por columna que es anulable.

ʞɔıu
fuente
Me gusta el formato de su respuesta, pero parece que le falta información útil que la respuesta principal proporciona sobre charsets y otras cosas
Joe Phillips
3

Para servidor SQL

alter table prg_ar_report_colors add Text_Color_Code VARCHAR (max);

Para MySql

alter table prg_ar_report_colors add Text_Color_Code longtext;

Para Oracle

alter table prg_ar_report_colors agregar Text_Color_Code CLOB;

Dinanath Parit
fuente
1
tenga en cuenta que el texto largo, el texto y el blob se almacenan de manera diferente que varchar. varchar se almacena con los otros campos, mientras que el texto se almacena en un archivo separado en el servidor. tiene pros y contras, así que ten cuidado de cuál elegir
santiago arizti
0

Mysql ¡Convertir columna de VARCHAR a TEXTO cuando está por debajo del tamaño límite!

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
fuente
-11

La longitud máxima de un varchar en MySQL 5.6.12 es 4294967295.

ajabep
fuente