2009-11-24 7 views
18

Si tengo una tabla con un campo que se declara como que acepta varchar (100) y luego realmente inserto la palabra "hola", ¿cuánto almacenamiento real se utilizará en el servidor mysql? ¿También una inserción de NULL dará como resultado que no se use almacenamiento aunque se haya declarado varchar (100)?¿Cuánto almacenamiento real se usa con una declaración varchar (100) en mysql?

¿Cuál es la respuesta, es consistente en diferentes implementaciones de bases de datos?

Respuesta

15

Si tengo una tabla con un campo que se declara como aceptar varchar (100) y luego insertar la palabra realidad "hola" la cantidad de almacenamiento real será utiliza en el servidor MySQL?

Mysql almacenará 5 bytes más un byte para la longitud. Si varchar es mayor que 255, almacenará 2 bytes para la longitud.

Tenga en cuenta que esto depende del juego de caracteres de la columna. Si el juego de caracteres es utf8, mysql requerirá hasta 3 bytes por carácter. Algunos motores de almacenamiento (es decir, memoria) siempre requerirán la longitud máxima de bytes por carácter para el juego de caracteres.

También habrá una inserción de resultado nulo en hay almacenamiento que se utiliza a pesar de que varchar (100) se declara?

Hacer una columna nulable significa que mysql tendrá que reservar un byte extra por hasta 8 columnas con nulos por fila. Esto se llama la "máscara nula".

¿Cuál es la respuesta, es consistente en diferentes implementaciones de bases de datos?

Ni siquiera es consistente entre los motores de almacenamiento de MySQL dentro!

+0

Tenga en cuenta que los números son para tablas MyISAM. InnoDB u otros motores pueden tener otros requisitos. Consulte también: http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html – johannes

+0

, por lo tanto, no importa cuánto límite hayamos establecido para varchar datatype. ¿derecho? –

13

Realmente depende del juego de caracteres de su mesa.

En contraste con CHAR, VARCHAR valora se almacenan como una de un byte o de dos bytes longitud de prefijo más datos. El prefijo de longitud indica el número de bytes en el valor. Una columna utiliza una longitud byte si los valores no requieren más de 255 bytes, dos bytes de longitud si los valores pueden requerir más de 255 bytes.

- source

UTF-8 a menudo requiere más espacio que una codificación hecha para uno o unos pocos idiomas. Las letras latinas con diacríticos y caracteres de otros scripts alfabéticos normalmente toman un byte por carácter en la codificación de bytes múltiples adecuada, pero toman dos en UTF-8. Los scripts de Asia Oriental generalmente tienen dos bytes por carácter en sus codificaciones de varios bytes pero toman tres bytes por carácter en UTF-8.

- source

+0

Muchas gracias, justo lo que quería saber. – Benj

+0

esto no responde la pregunta relacionada con los nulos. –

+0

Sí, pero el enlace de origen explica específicamente los requisitos de bytes de los campos VARCHAR y proporciona un ejemplo con la cadena vacía. Pensé que valía la pena leerlo. –

2

varchar sólo almacena lo que se utiliza mientras que las tiendas de char un número determinado de bytes.

0

Utf16 toma a veces menos datos que utf8, para algunos idiomas raros, no sé cuáles.

Chicos, ¿hay una opción para usar COMPRESSed tablas en MySql? Como en Apache. Muchas gracias

Cuestiones relacionadas