Estoy de acuerdo con todo lo dicho por a_horse_with_no_name, y generalmente estoy de acuerdo con el comentario de Erwin:
No, char es inferior (y anticuado). text y varchar realizan (casi) lo mismo.
Metadatos
Con una pequeña excepción, el único momento que uso char()
es cuando quiero que los metadatos digan que DEBE tener caracteres x. Aunque sé que char()
solo se queja si la entrada está por encima del límite, con frecuencia protegeré contra los bajos fondos en una CHECK
restricción. Por ejemplo,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Hago esto por algunas razones,
char(x)
a veces se infiere con los cargadores de esquemas como una columna de ancho fijo. Esto puede marcar la diferencia en un lenguaje optimizado para cadenas de ancho fijo.
- Establece una convención que tiene sentido y se aplica fácilmente. Puedo escribir un cargador de esquemas en un lenguaje para generar código a partir de esta convención.
Necesito un ejemplo de dónde puedo hacer esto,
- Abreviaturas de estado de dos letras, aunque debido a que esta lista se puede enumerar, normalmente lo haré con un
ENUM
.
- Números de identificación del vehículo
- Números de modelo (de tamaño fijo)
En errores
Tenga en cuenta que algunas personas pueden sentirse incómodas con la incongruencia de los mensajes de error en ambos lados del límite, pero no me molesta
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Contrastar con varchar
Además, creo que la sugerencia anterior encaja muy bien con una convención de uso casi siempretext
. Usted pregunta por eso varchar(n)
también. Yo nunca uso eso . Al menos, no recuerdo la última vez que lo usé varchar(n)
.
- Si una especificación tiene un campo de ancho estático en el que confío, utilizo
char(n)
,
- De lo contrario, uso
text
cual es efectivamente varchar
(sin límite)
Si encontrara una especificación que tuviera claves de texto de longitud variable que fueran significativas y confiara en tener una longitud máxima constante, usaría varchar(n)
también la . Sin embargo, no puedo pensar en nada que se ajuste a ese criterio.
Notas adicionales
Preguntas y respuestas relacionadas: