Saltar al contenido

Diferencia entre VARCHAR y TEXTO en MySQL

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, donde c 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 (para M ≤ 255) o 2 + c (para 256 ≤ M ≤ 65535) bytes de espacio en disco donde c 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 MhastaM = 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 VARCHARsi 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 LONGTEXTPero 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 TINYTEXTsiempre 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *