MySQL: ¿VARCHAR grande frente a TEXTO?
Tengo una tabla de mensajes en MySQL que registra mensajes entre usuarios. Aparte de los identificadores y tipos de mensajes típicos (todos los tipos enteros), necesito guardar el texto del mensaje real como VARCHAR o TEXTO. Estoy estableciendo un límite de interfaz de usuario de 3000 caracteres, lo que significa que los mensajes nunca se insertarán en la base de datos por más tiempo que esto.
¿Existe alguna razón para utilizar VARCHAR(3000) o TEXT? Hay algo en simplemente escribir VARCHAR(3000) que parece algo contrario a la intuición. He leído otras publicaciones similares en Stack Overflow, pero sería bueno obtener vistas específicas de este tipo de almacenamiento de mensajes común.
TEXT
yBLOB
puede almacenarse fuera de la tabla; la tabla solo tiene un puntero a la ubicación del almacenamiento real. El lugar donde se almacena depende de muchas cosas, como el tamaño de los datos, el tamaño de las columnas, el formato de fila y la versión de MySQL.VARCHAR
se almacena en línea con la tabla.VARCHAR
es más rápido cuando el tamaño es razonable, la compensación de cuál sería más rápido depende de sus datos y su hardware, querrá comparar un escenario del mundo real con sus datos.
¿Puedes predecir cuánto durará la entrada del usuario?
VARCHAR(X)
Longitud máxima: variable, hasta 65 535 bytes (64 KB)
Caso: nombre de usuario, correo electrónico, país, asunto, contraseña
TEXTO
Longitud máxima: 65.535 bytes (64 KB)
Caso: mensajes, correos electrónicos, comentarios, texto formateado, html, código, imágenes, enlaces
TEXTO MEDIO
Longitud máxima: 16.777.215 bytes (16 MB)
Caja: cuerpos json grandes, libros de longitud corta a mediana, cadenas csv
TEXTO LARGO
Longitud máxima: 4.294.967,29 bytes (4 GB)
Caso: libros de texto, programas, años de archivos de registros, harry potter y el cáliz de fuego, registros de investigaciones científicas
Hay más información sobre esta pregunta .
Sólo para aclarar las mejores prácticas:
Los mensajes en formato de texto casi siempre deben almacenarse como TEXTO (terminan siendo arbitrariamente largos)
Los atributos de cadena deben almacenarse como VARCHAR (el nombre de usuario de destino, el asunto, etc...).
Entiendo que tienes un límite inicial, lo cual es genial hasta que deja de serlo. *sonrisa* El truco consiste en pensar en la base de datos como algo separado de las aplicaciones que se conectan a ella. El hecho de que una aplicación ponga un límite a los datos no significa que los datos estén intrínsecamente limitados.
¿Qué tienen los mensajes en sí que los obliga a no tener nunca más de 3000 caracteres? Si es solo una restricción de aplicación arbitraria (por ejemplo, para un cuadro de texto o algo así), use un TEXT
campo en la capa de datos.