2012-04-10 8 views
8

Se pregunta cuánto espacio de almacenamiento real ocuparán estos dos tipos de datos, ya que la documentación de MySQL no está del todo clara al respecto.Conjuntos de caracteres y tamaños de almacenamiento de MySQL char & varchar

CHAR (M) M × w bytes, 0 < = M < = 255, donde w es el número de bytes necesarios para el carácter de longitud máxima en el conjunto de caracteres

VARCHAR (M) , VARBINARY (M) L + 1 bytes si los valores de columna requieren 0 - 255 bytes, L + 2 bytes si los valores pueden requerir más de 255 bytes

Esto parece implicar a mí que, dado un utf8-codificada base de datos, un CHAR siempre ocupará 32 bits por carácter, mientras que un VARCHAR tomará entre 8 y 32 dependiendo de la longitud del byte real de los caracteres almacenados. ¿Es eso correcto? ¿O un VARCHAR implica un ancho de caracteres de 8 bits, y el almacenamiento de caracteres UTF8 de múltiples octetos en realidad consume varios 'caracteres' del VARCHAR? ¿O el VARCHAR también almacena siempre 32 bits por personaje? Tantas posibilidades

No es algo de lo que haya tenido que preocuparme antes, pero estoy empezando a alcanzar los límites de tamaño de la tabla temporal en memoria y no quiero necesariamente tener que aumentar el conjunto disponible de MySQL (para el segundo hora).

Respuesta

8

CHAR y VARCHAR ambos cuentan los caracteres. Ambos cuentan el almacenamiento máximo que pueden requerir dada la codificación de caracteres y la longitud. Para ASCII, eso es 1 byte por personaje. Para UTF-8, eso es 3 bytes por carácter (no 4 como cabría esperar, porque MySQL's Unicode support is crippled por algún motivo, y no admite ningún carácter Unicode que requiera 4 bytes en UTF-8). Hasta ahora, CHAR y VARCHAR son lo mismo.

Ahora, CHAR sigue adelante y reserva esta cantidad de almacenamiento.

VARCHAR asignados en su lugar 1 o 2 bytes, dependiendo de si este almacenamiento máximo es < 256 o ≥ 256. Y la cantidad real de espacio ocupado por la entrada es de uno o dos bytes, más la cantidad de espacio realmente ocupado por la cuerda.

Curiosamente, esto hace 85 un número mágico para UTF-8 VARCHAR:

  • VARCHAR(85) utiliza 1 byte para la longitud debido a que la longitud máxima posible de 85 (paralizado) caracteres UTF-8 es 3 × 85 = 255.
  • VARCHAR(86) utiliza 2 bytes para la longitud debido a que la longitud máxima posible de 86 (paralizado) caracteres UTF-8 es 3 × 86 = 258.
+1

para añadir a esto, 'almacenamiento utf8' de MySQL no es solo lisiado, no es tu estándar UTF-8 tampoco. Las cadenas codificadas con 'utf8' se almacenan utilizando aproximadamente el doble del almacenamiento de las cadenas codificadas en UTF-8, lo que lo hace aún más ineficiente. – deceze

+0

@deceze No estaba al tanto de eso. ¿Tiene algún detalle o referencia sobre eso? – Celada

+0

Ojalá lo hubiera hecho, pero la documentación no dice mucho al respecto. Hubo una pregunta reciente aquí sobre el volcado de la base de datos donde los datos fueron volcados en binario-como-es, que es donde esto es muy aparente. – deceze

Cuestiones relacionadas