sql >> Base de Datos >  >> RDS >> Mysql

Diferencia entre VARCHAR y TEXTO en MySQL

TL;DR

TEXT

  • tamaño máximo fijo de 65535 caracteres (no se puede limitar el tamaño máximo)
  • toma 2 + c bytes de espacio en disco, donde c es la longitud de la cadena almacenada.
  • no puede ser (totalmente) parte de un índice. Sería necesario especificar una longitud de prefijo.

VARCHAR(M)

  • tamaño máximo variable de M personajes
  • 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 la cadena almacenada
  • puede ser parte de un índice

Más detalles

TEXT tiene un fijo tamaño máximo de 2¹⁶-1 = 65535 caracteres.
VARCHAR tiene una variable tamaño máximo M hasta M = 2¹⁶-1 .
Por lo tanto, no puede 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 la columna es demasiado larga, debe usar solo los primeros caracteres de VARCHAR columna en su índice (Consulte la documentación para CREATE INDEX ).

Pero también quieres usar VARCHAR , si sabe que la longitud máxima de la cadena de entrada posible es solo M , p.ej. un número de teléfono o un nombre o algo así. Entonces puedes usar VARCHAR(30) en lugar 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 usa 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 toda la cadena se pueda almacenar en el búfer. Es posible que esto también suceda en otros idiomas además de PHP.

Sin embargo, debe siempre verifique la entrada (¿Es demasiado larga? ¿Contiene código extraño?) antes almacenarlo en la base de datos.

Aviso:para ambos tipos, el espacio en disco requerido depende únicamente de la longitud de la cadena almacenada y no de la longitud máxima.
Por ejemplo, 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 de la cadena 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ían 6 bytes (2 bytes para almacenar la longitud de la cadena 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 . Puede leer más sobre esto aquí .