323 votos

¿Cuál es el tamaño máximo de VARCHAR en MySQL?

Me gustaría saber cuál es el tamaño máximo para un tipo VARCHAR en MySQL.

Leí que el tamaño máximo está limitado por el tamaño de la fila, que es aproximadamente de 65k. Intenté configurar el campo como varchar(20000) pero dice que es demasiado grande.

Podría configurarlo como varchar(10000). ¿Cuál es el máximo exacto al que puedo configurarlo?

1 votos

Un blog detallado: goo.gl/Hli6G3

314voto

rajukoyilandy Puntos 1352

Ten en cuenta que MySQL tiene un límite máximo de tamaño de fila

La representación interna de una tabla MySQL tiene un límite máximo de tamaño de fila de 65,535 bytes, sin contar los tipos BLOB y TEXT. Las columnas BLOB y TEXT solo contribuyen con 9 a 12 bytes al límite de tamaño de fila porque su contenido se almacena por separado del resto de la fila. Lee más sobre Límites en el número de columnas de tabla y tamaño de fila.

El tamaño máximo que una sola columna puede ocupar es diferente antes y después de MySQL 5.0.3

Los valores en columnas VARCHAR son cadenas de longitud variable. La longitud se puede especificar como un valor de 0 a 255 antes de MySQL 5.0.3, y de 0 a 65,535 en las versiones 5.0.3 y posteriores. La longitud máxima efectiva de un VARCHAR en MySQL 5.0.3 y posteriores está sujeta al tamaño máximo de fila (65,535 bytes, que se comparte entre todas las columnas) y al conjunto de caracteres utilizado.

Sin embargo, ten en cuenta que el límite es menor si utilizas un conjunto de caracteres multi-byte como utf8 o utf8mb4.

Usa TEXT types para superar el límite de tamaño de fila.

Los cuatro tipos TEXT son TINYTEXT, TEXT, MEDIUMTEXT y LONGTEXT. Estos corresponden a los cuatro tipos BLOB y tienen las mismas longitudes máximas y requisitos de almacenamiento.

Más detalles sobre los tipos BLOB y TEXT

Aún más

Consulta más detalles en Requisitos de almacenamiento de tipos de datos que trata sobre los requisitos de almacenamiento para todos los tipos de datos.

5 votos

¿Qué es una cadena "larga"?

9 votos

Intento evitar las columnas de texto ya que pueden causar que se creen tablas temporales al ordenarlas.

1 votos

Si tomo varchar(200) para el nombre y solo guardo 6 caracteres en este campo, ¿cuántos bytes ocupará el nombre?

62voto

paxdiablo Puntos 341644

Según la documentación en línea, hay un límite de 64K filas y puedes calcular el tamaño de la fila usando:

longitud de fila = 1
             + (suma de longitudes de columnas)
             + (número de columnas NULL + delete_flag + 7)/8
             + (número de columnas de longitud variable)

Debes tener en cuenta que las longitudes de las columnas no se corresponden directamente con su tamaño. Por ejemplo, CHAR(10) CHARACTER SET utf8 requiere tres bytes para cada uno de los diez caracteres, ya que ese codificación particular debe tener en cuenta la propiedad de tres bytes por carácter de utf8 (ese es el cifrado utf8 de MySQL en lugar de "verdadero" UTF-8, que puede tener hasta cuatro bytes).

Pero, si el tamaño de tu fila se acerca a los 64K, es posible que desees examinar el esquema de tu base de datos. Es raro que una tabla necesite ser tan ancha en una base de datos bien configurada (3NF) - es posible, solo que no muy común.

Si deseas utilizar más que eso, puedes usar los tipos BLOB o TEXT. Estos no cuentan para el límite de 64K de la fila (más allá de una pequeña huella administrativa) pero debes ser consciente de otros problemas que surgen de su uso, como no poder ordenar usando todo el bloque de texto más allá de cierto número de caracteres (aunque esto se puede configurar para incrementar), forzando que las tablas temporales estén en disco en lugar de en memoria, o tener que configurar los búferes de comunicación entre cliente y servidor para manejar eficientemente los tamaños.

Los tamaños permitidos son:

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

Aún tienes la discrepancia de byte/caracter (por lo que una columna MEDIUMTEXT utf8 puede almacenar "solo" alrededor de medio millón de caracteres, (16M-1)/3 = 5,592,405) pero aún amplía en gran medida tu rango.

4 votos

Ten en cuenta que los tipos TEXT NO se pueden almacenar en tablas de memoria, por lo que hay una penalización significativa en el rendimiento al utilizarlos cuando un VARCHAR sería suficiente.

0 votos

La propiedad de tres bytes por carácter de utf8 de MySql utf8, que en realidad no es utf8 en absoluto. En realidad, el máx. bytes en un carácter utf-8 es 4. Por esta razón, siempre debes configurar la codificación a utf8mb4 en MySQL. utf8mb4 es el nombre de MySql para lo que el resto del mundo llama utf8.

1 votos

@StijndeWitt, gracias por eso. aclarado para indicar que me refería al método de codificación utf8 de MySQL en lugar de UTF-8. En general, uso la variante en mayúsculas para indicar "verdadero" UTF-8 ya que esa es la convención aceptada por IANA.

42voto

Attila Bujáki Puntos 1221

Fuente

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

VARCHAR(65535) Sin embargo, ten en cuenta que el límite es menor si utilizas un conjunto de caracteres multibyte:

VARCHAR(21844) CHARACTER SET utf8

24 votos

Por favor, deja de usar CHARACTER SET utf8 en ejemplos. Debería ser CHARACTER SET utf8mb4 (si deseas que todo el texto Unicode se almacene correctamente... ¿y quién no quiere eso?)

4 votos

Para CHARSET=utf8mb4 usar VARCHAR(16383).

3 votos

Usar utf8mb4 te pondrá contra el límite de ancho de índice en una situación en la que utf8 no lo hace. Si examinas los conjuntos de caracteres que están incluidos en utf8mb4 pero no en utf8, es posible que descubras que incluir todas las diversas formas de jeroglíficos y otros conjuntos de caracteres arcanos no vale la pena la significativa penalización en el rendimiento (determinada empíricamente). No es tan claro como Stijn sugiere.

6voto

SRIRAM Puntos 955

También puedes usar MEDIUMBLOB/LONGBLOB o MEDIUMTEXT/LONGTEXT.

Un tipo BLOB en MySQL puede almacenar hasta 65,534 bytes, si intentas almacenar más datos MySQL truncará los datos. MEDIUMBLOB puede almacenar hasta 16,777,213 bytes y LONGBLOB puede almacenar hasta 4,294,967,292 bytes.

-6voto

mvp Puntos 29360

Puedes usar TEXT tipo, que no está limitado a 64KB.

33 votos

Esto no responde la pregunta.

1 votos

Tu respuesta no es relevante para la pregunta.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X