Pregunta

¿Solo para aclarar, al especificar algo como Varchar (45) significa que puede tomar hasta máximo 45 caracteres? Recuerdo que escuché de alguien hace unos años que el número en el paréntesis no se refiere al número de personajes, luego la persona trató de explicarme algo bastante complicado que no entiendo y olvidé.

¿Y cuál es la diferencia entre Char y Varchar? Busqué un poco y vi que Char le brinda el máximo del tamaño de la columna y es mejor usarlos si sus datos tienen un tamaño fijo y usar Varchar si su tamaño de datos varía.

Pero si le da el máximo del tamaño de la columna de todos los datos de esta columna, ¿no es mejor usarlo cuando varía el tamaño de sus datos? Especialmente si no sabe qué tan grande será el tamaño de sus datos. Varchar necesita especificar el tamaño (Char no necesita realmente, ¿verdad?), ¿No es más problemático?

¿Fue útil?

Solución

También debe especificar el tamaño con CHAR. Con CHAR, Los valores de la columna están acolchados con espacios para llenar el tamaño que especificó, mientras que con VARCHAR, solo se almacena el valor real que especificó.

Por ejemplo:

CREATE TABLE test (
    char_value CHAR(10),
    varchar_value VARCHAR(10)
);

INSERT INTO test VALUES ('a', 'b');

SELECT * FROM test;

Lo anterior seleccionará "A" para char_value y "B" para varchar_value

Si todos sus valores son aproximadamente del mismo tamaño, el CHAR es posiblemente una mejor opción porque a menudo requerirá menos espacio de almacenamiento que VARCHAR. Esto es porque VARCHAR almacena tanto la longitud del valor como el valor en sí, mientras que CHAR puede simplemente almacenar el valor (de tamaño fijo).

Otros consejos

los Documentación de MySQL Da una buena explicación de los requisitos de almacenamiento de los diversos tipos de datos.

En particular, para una cadena de longitud l, un CHAR(M) DataType tomará bytes (M XC) (donde C es el número de bytes requeridos para almacenar un personaje ... esto depende del conjunto de caracteres en uso). A VARCHAR(M) Tomará (l + 1) o (l + 2) dependiendo de si M es <= 255 o> 255.

Por lo tanto, realmente depende de cuánto tiempo espere que sean sus cuerdas, cuál será la variación en la longitud.

NB: La documentación no discute el impacto de los conjuntos de caracteres en los requisitos de almacenamiento de un VARCHAR escribe. He tratado de citarlo con precisión, pero supongo que también necesitarías multiplicar la longitud de la cadena por el ancho de byte del personaje para obtener el requisito de almacenamiento.

Char y Varchar realmente se vuelven irrelevantes si solo tiene 1 campo de longitud de variable en su tabla, como un Varchar o un texto. MySQL cambiará automáticamente todo Char a Varchar.

El registro de longitud/tamaño fijo puede darle un rendimiento adicional, pero no puede usar ningún tipo de campo de longitud variable. La razón es que será más rápido y más fácil para MySQL encontrar el siguiente registro.

Por ejemplo, si hace una selección * del límite de tabla 10, MySQL tiene que escanear el archivo de tabla para el décimo registro. Esto significa encontrar el final de cada registro hasta que encuentre el final del décimo registro. Pero si su tabla tiene registros de longitud/tamaño fijos, MySQL solo necesita conocer el tamaño del registro y luego omitir 10 x #bytes.

Si sabe que una columna contendrá un pequeño número fijo de caracteres use un char, de lo contrario use un varchar. Una columna de char está acolchada a la longitud máxima.

Varchar tiene una pequeña sobrecarga (4-8 bytes dependiendo de RDBMS), pero solo usa la sobrecarga + el número real de caracteres almacenados.

Para los valores que sabe que serán constantes, por ejemplo, para números de teléfono, códigos postales, etc., es óptimo usar "char" con seguridad.

Las cosas complicadas que no recuerdas es que los 45 se refieren a bytes, no chars. No es lo mismo si está utilizando una codificación de caracteres multibyte. En Oracle puede especificar bytes o caracteres explícitamente.

varchar2(45 BYTE)

o

varchar2(45 CHAR)

Ver Diferencia entre byte y char en los tipos de datos de columna

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top