Recuerda que en las ciencias informáticas un error casi siempre tiene diferentes soluciones, pero te compartiremos lo más óptimo y mejor.
Solución:
TL;DR
TEXT
- tamaño máximo fijo de 65535 caracteres (no puede limitar el tamaño máximo)
- toma 2 +
c
bytes de espacio en disco, dondec
es la longitud de lo almacenado string. - no puede ser (totalmente) parte de un índice. Habría que especificar un prefix largo.
VARCHAR(M)
- tamaño máximo variable de
M
caracteres M
debe estar entre 1 y 65535- toma 1 +
c
bytes (paraM
≤ 255) o 2 +c
(para 256 ≤M
≤ 65535) bytes de espacio en disco dondec
es la longitud de lo almacenado string - puede ser parte de un índice
Más detalles
TEXT
tiene un reparado tamaño máximo de 2¹⁶-1 = 65535
caracteres.VARCHAR
tiene un variable tamaño máximo M
hastaM = 2¹⁶-1
.
Así que no puedes elegir el tamaño de TEXT
pero puedes por un VARCHAR
.
La otra diferencia es que no puede poner un índice (excepto un índice de texto completo) en un TEXT
columna.
Entonces, si desea tener un índice en la columna, debe usar VARCHAR
. Pero tenga en cuenta que la longitud de un índice también está limitada, por lo que si su VARCHAR
columna es demasiado larga, debe usar solo los primeros caracteres de la VARCHAR
columna en su índice (Vea la documentación para CREATE INDEX
).
Pero también quieres usar VARCHAR
si sabe que la longitud máxima de la entrada posible string es solo M
, por ejemplo, un número de teléfono o un nombre o algo como esto. Entonces puedes usar VARCHAR(30)
en vez de TINYTEXT
o TEXT
y si alguien intenta guardar el texto de los tres libros de “El señor de los anillos” en la columna de su número de teléfono, solo almacena los primeros 30 caracteres 🙂
Editar: Si el texto que desea almacenar en la base de datos tiene más de 65535 caracteres, debe elegir MEDIUMTEXT
o LONGTEXT
Pero ten cuidado: MEDIUMTEXT
almacena cadenas de hasta 16 MB, LONGTEXT
hasta 4 GB. Si utiliza LONGTEXT
y obtenga los datos a través de PHP (al menos si usa mysqli
sin store_result
), es posible que obtenga un error de asignación de memoria, porque PHP intenta asignar 4 GB de memoria para asegurarse de que todo string se puede amortiguar. Esto quizás también suceda en otros idiomas además de PHP.
Sin embargo, deberías siempre verifique la entrada (¿Es demasiado larga? ¿Contiene código extraño?) antes de almacenarlo en la base de datos.
Aviso: para ambos tipos, el espacio en disco requerido depende solo de la longitud del archivo almacenado. string y no en la longitud máxima.
P.ej si usa el conjunto de caracteres latin1 y almacena el texto “Prueba” en VARCHAR(30)
, VARCHAR(100)
y TINYTEXT
siempre requiere 5 bytes (1 byte para almacenar la longitud del string y 1 byte para cada carácter). Si almacena el mismo texto en un VARCHAR(2000)
o un TEXT
columna, también requeriría el mismo espacio, pero, en este caso, sería de 6 bytes (2 bytes para almacenar el string longitud y 1 byte para cada carácter).
Para obtener más información, consulte la documentación.
Finalmente, quiero agregar un aviso, que ambos, TEXT
y VARCHAR
son tipos de datos de longitud variable, por lo que lo más probable es que minimicen el espacio que necesita para almacenar los datos. Pero esto viene con una compensación por el rendimiento. Si necesita un mejor rendimiento, debe usar un tipo de longitud fija como CHAR
. Puedes leer más sobre esto aquí.
Hay un detalle importante que se ha omitido en la respuesta anterior.
MySQL impone un límite de 65.535 bytes para el tamaño máximo de cada fila. El tamaño de un VARCHAR
columna se cuenta para el tamaño máximo de fila, mientras que TEXT
Se supone que las columnas almacenan sus datos por referencia, por lo que solo necesitan de 9 a 12 bytes. Eso significa que incluso si el tamaño máximo “teórico” de su VARCHAR
El campo tiene 65,535 caracteres, no podrá lograrlo si tiene más de una columna en su tabla.
También tenga en cuenta que el número real de bytes requeridos por un VARCHAR
El campo depende de la codificación de la columna (y del contenido). MySQL cuenta los bytes máximos posibles utilizados para el tamaño máximo de fila, por lo que si usa una codificación multibyte como utf8mb4
(que casi con toda seguridad debería) consumirá aún más de su tamaño máximo de fila.
Corrección: independientemente de cómo MySQL calcule el tamaño máximo de fila, ya sea que el VARCHAR
/TEXT
los datos de campo REALMENTE se almacenan en la fila o se almacenan por referencia dependiendo de su motor de almacenamiento subyacente. Para InnoDB, el formato de fila afecta este comportamiento. (Gracias Bill-Karwin)
Razones para usar TEXT
:
- Si desea almacenar un párrafo o más de texto
- Si no necesita indexar la columna
- Si ha alcanzado el límite de tamaño de fila para su tabla
Razones para usar VARCHAR
:
- Si desea almacenar algunas palabras o una frase
- Si desea indexar la columna (completa)
- Si desea utilizar la columna con extranjeros-key restricciones
Sección de Reseñas y Valoraciones
Eres capaz de sustentar nuestro trabajo escribiendo un comentario o dejando una valoración te damos la bienvenida.