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

300

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

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

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

usuario1832628
fuente
1
Un blog detallado: goo.gl/Hli6G3
Suresh Kamrushi el

Respuestas:

293

Tenga 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 de 9 a 12 bytes hacia el límite de tamaño de fila porque sus contenidos se almacenan por separado del resto de la fila. Lea más sobre los límites en el conteo de columnas de tabla y el tamaño de fila.

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

Los valores en las 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 5.0.3 y versiones posteriores. La longitud máxima efectiva de un VARCHAR en MySQL 5.0.3 y posterior 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, tenga en cuenta que el límite es menor si utiliza un conjunto de caracteres de varios bytes como utf8 o utf8mb4.

Utilice los TEXTtipos para superar el límite de tamaño de fila.

Los cuatro tipos de TEXTO 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

Pedido más detalles sobre los requisitos de almacenamiento de tipo de datos que se ocupa de los requisitos de almacenamiento para todos los tipos de datos.

rajukoyilandy
fuente
44
¿Qué es una cadena "larga"?
Richard H
66
Sin embargo, trato de evitar las columnas TEXT, ya que pueden crear tablas temporales cuando están presentes y ordenando
Robert Swisher
1
Si tomo varchar (200) como primer nombre y almaceno solo 6 caracteres en este campo, ¿cuántos bytes ocuparán el primer nombre?
Paresh Gami
2
@PareshGami - 6 + 1 = 7 caracteres! A diferencia de CHAR, los valores VARCHAR se almacenan como un prefijo de longitud de 1 byte o 2 byte más datos. más ...
rajukoyilandy
58

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

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

Debe tener en cuenta que las longitudes de columna no son un mapeo individual de su tamaño. Por ejemplo, CHAR(10) CHARACTER SET utf8requiere tres bytes para cada uno de los diez caracteres, ya que esa codificación particular debe tener en cuenta la propiedad de tres bytes por carácter de utf8(esa es la utf8codificación de MySQL en lugar de UTF-8 "real", que puede tener hasta cuatro bytes )

Pero, si el tamaño de su fila se acerca a 64 K, es posible que desee examinar el esquema de su base de datos. Es una tabla rara que debe ser tan amplia en una base de datos configurada correctamente (3NF); es posible, pero no muy común.

Si desea usar más que eso, puede usar los tipos BLOBo TEXT. Estos no cuentan contra el límite de 64K de la fila (que no sea una pequeña huella administrativa), pero debe ser consciente de otros problemas que surgen de su uso, como no poder ordenar usando todo el bloque de texto más allá de un cierto número de caracteres (aunque esto se puede configurar hacia arriba), lo que obliga a las tablas temporales a estar en el disco en lugar de en la memoria, o tener que configurar los búferes de comunicaciones del cliente y el servidor para manejar los tamaños de manera eficiente.

Los tamaños permitidos son:

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

Todavía tiene la falta de coincidencia de bytes / caracteres (de modo que una MEDIUMTEXT utf8columna puede almacenar "solo" aproximadamente medio millón de caracteres (16M-1)/3 = 5,592,405) , pero aún así amplía enormemente su rango.

paxdiablo
fuente
44
Tenga en cuenta que los tipos de TEXTO NO pueden almacenarse en tablas de memoria, por lo que existe una penalización de rendimiento significativa por usarlos cuando un VARCHAR sería suficiente.
Camden S.
'la propiedad de tres bytes por carácter de utf8' de MySql utf8 , que en realidad no es utf8 en absoluto. En realidad el max. bytes en un utf-8 char es 4 . Por esta razón, siempre debe establecer la codificación utf8mb4en MySQL . utf8mb4es el nombre de MySql para lo que el resto de la palabra llama utf8.
Stijn de Witt
1
@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. Generalmente uso la variante en mayúscula para indicar UTF-8 "real" ya que esa es la convención aceptada de la IANA.
paxdiablo
41

Fuente

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) JUEGO DE CARACTERES utf8

Atila
fuente
20
Por favor, deje de usar CHARACTER SET utf8en ejemplos. Debería serlo CHARACTER SET utf8mb4(si desea que todo el texto Unicode se almacene correctamente ... y ¿quién no quiere eso?)
Stijn de Witt
44
Para CHARSET=utf8mb4su uso VARCHAR(16383).
Wil Moore III
3
El uso de utf8mb4 lo pondrá en contra del límite del ancho del índice en una situación en la que utf8 no. Si examina los conjuntos de caracteres que se incluyen en utf8mb4 pero no en utf8, es posible que incluir todas las diversas formas de jeroglíficos y otros conjuntos de caracteres arcanos no valga la pena de rendimiento significativa (determinada empíricamente). No es tan cortado y seco como Stijn implica.
kcrossen
Muchos emojis también están presentes en utf8mb4 y faltan en utf8, por lo que puede cambiar la ecuación de si vale la pena.
Brian Morearty
23

De la documentación de MySQL:

La longitud máxima efectiva de un VARCHAR en MySQL 5.0.3 y posterior 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. Por ejemplo, los caracteres utf8 pueden requerir hasta tres bytes por carácter, por lo que una columna VARCHAR que utiliza el conjunto de caracteres utf8 puede declararse como un máximo de 21.844 caracteres.

Los límites para el VARCHAR varían según el juego de caracteres utilizado. Usar ASCII usaría 1 byte por carácter. Lo que significa que podría almacenar 65.535 caracteres. El uso de utf8 usará 3 bytes por carácter, lo que dará como resultado un límite de caracteres de 21,844. ¡PERO si está utilizando el moderno juego de caracteres multibyte utf8mb4 que debería usar! Es compatible con emojis y otros caracteres especiales. Utilizará 4 bytes por carácter. Esto limitará el número de caracteres por tabla a 16,383. Tenga en cuenta que otros campos como INT también se contarán en estos límites.

Conclusión:

utf8 máximo de 21.844 caracteres

utf8mb4 máximo de 16,383 caracteres

Firze
fuente
6

también puede usar MEDIUMBLOB / LONGBLOB o MEDIUMTEXT / LONGTEXT

Un tipo BLOB en MySQL puede almacenar hasta 65.534 bytes, si intenta almacenar más de esta cantidad de datos, MySQL truncará los datos. MEDIUMBLOB puede almacenar hasta 16.777.213 bytes, y LONGBLOB puede almacenar hasta 4.294.967.292 bytes.

SRIRAM
fuente
3

Antes de Mysql versión 5.0.3, el tipo de datos Varchar puede almacenar 255 caracteres, pero desde 5.0.3 puede almacenar 65,535 caracteres.

PERO tiene una limitación del tamaño máximo de fila de 65.535 bytes. Significa incluir todas las columnas, no debe tener más de 65.535 bytes.

En su caso, es posible que cuando intente establecer más de 10000 supere los 65,535 y mysql dará el error.

Para más información: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog con ejemplo: http://goo.gl/Hli6G3

Suresh Kamrushi
fuente
-5

Puede usar el TEXTtipo , que no está limitado a 64 KB.

mvp
fuente
31
Esto no responde la pregunta.
DreamWave
1
Su respuesta no es relevante para la pregunta.
Girish