Cuando creamos una tabla en mysql con una columna VARCHAR
, tenemos que establecer la longitud de la misma. Pero para el tipo TEXT
no tenemos que proporcionar la longitud.
¿Cuáles son las diferencias entre VARCHAR
y TEXT
?
TEXTO**
c
bytes de espacio en disco, donde c
es la longitud de la cadena almacenadaVARCHAR(M)
M
caracteresM
tiene que estar entre 1 y 65535c
bytes (para M
≤ 255) o 2 + c
(para 256 ≤ M
≤ 65535) bytes de espacio en disco donde c
es la longitud de la cadena almacenadaEl texto tiene un tamaño máximo fijado de 2¹⁶-1 = 65535
caracteres.
El tamaño máximo de VARCHAR
es variable hasta M = 2¹⁶-1
.
Por lo tanto, no se puede elegir el tamaño de TEXT
pero sí de un VARCHAR
.
La otra diferencia es que no puedes poner un índice (excepto un índice de texto completo) en una columna TEXT
.
Así que si quieres tener un índice en la columna, tienes que usar VARCHAR
. Pero ten en cuenta que la longitud de un índice también está limitada, así que si tu columna VARCHAR
es demasiado larga tienes que usar sólo los primeros caracteres de la columna VARCHAR
en tu índice (Ver la documentación de CREATE INDEX
).
Pero también puedes usar VARCHAR
, si sabes que la longitud máxima de la posible cadena de entrada es sólo M
, por ejemplo un número de teléfono o un nombre o algo así. Entonces puede utilizar VARCHAR(30)
en lugar de TINYTEXT
o TEXT
y si alguien intenta guardar el texto de los tres "El Señor del Anillo" libros en su columna de número de teléfono sólo almacena los primeros 30 caracteres :)
Edición: Si el texto que quieres almacenar en la base de datos tiene más de 65535 caracteres, tienes que elegir MEDIUMTEXT
o LONGTEXT
, pero ten cuidado: MEDIUMTEXT
almacena cadenas de hasta 16 MB, LONGTEXT
hasta 4 GB. Si utiliza LONGTEXT
y obtiene los datos a través de PHP (al menos si utiliza mysqli
sin store_result
), puede obtener un error de asignación de memoria, porque PHP intenta asignar 4 GB de memoria para asegurarse de que toda la cadena puede ser almacenada en el buffer. Esto puede ocurrir también en otros lenguajes además de PHP.
Sin embargo, debería siempre comprobar la entrada (¿Es demasiado larga? ¿Contiene código extraño?) antes de almacenarla en la base de datos.
Nota: Para ambos tipos, el espacio de disco necesario depende sólo de la longitud de la cadena almacenada y no de la longitud máxima.
*Por ejemplo, si utiliza el conjunto de caracteres latin1 y almacena el texto "Test" en VARCHAR(30)
, VARCHAR(100)
y TINYTEXT
, siempre necesitará 5 bytes (1 byte para almacenar la longitud de la cadena y 1 byte para cada carácter). Si almacena el mismo texto en una columna VARCHAR(2000)
o TEXT
, también requerirá el mismo espacio, pero, en este caso, será de 6 bytes (2 bytes para almacenar la longitud de la cadena y 1 byte para cada carácter).
Para más información, consulte la documentación.
Por último, quiero añadir un aviso, que tanto TEXT
como VARCHAR
son tipos de datos de longitud variable, y por lo tanto lo más probable es que minimicen el espacio que necesitas para almacenar los datos. Pero esto viene con una contrapartida de rendimiento. Si necesitas un mejor rendimiento, tienes que utilizar un tipo de longitud fija como CHAR
. Puedes leer más sobre esto aquí.