Cuadro 8.4. Tipos de caracteres

Nombre Descripción
character varying(n), varchar(n) longitud variable con límite
character(n), char(n) de longitud fija, en blanco acolchado
text longitud ilimitada variable

La Tabla 8.4 muestra los tipos de caracteres de propósito general disponibles en PostgreSQL.

SQL define dos tipos de caracteres principales: character varying(n) y character(n), dónde n es un número entero positivo. Ambos tipos pueden almacenar cadenas de hasta n caracteres (no bytes) de longitud. Un intento de almacenar un string en una columna de estos tipos dará lugar a un error, a menos que los caracteres sobrantes sean todos espacios, en cuyo caso el string se truncará a la longitud máxima. (Esta excepción algo extraña es requerida por el estándar SQL). string a almacenar es más corto que la longitud declarada, valores de tipo character se rellenará con espacios; valores de tipo character varying simplemente almacenará el más corto string.

Si uno lanza explícitamente un valor a character varying(n) o character(n), un valor de longitud excesiva se truncará a n personajes sin generar un error. (Esto también es requerido por el estándar SQL).

Las notaciones varchar(n) y char(n) son alias para character varying(n) y character(n), respectivamente. character sin especificador de longitud es equivalente a character(1). Si character varying se utiliza sin especificador de longitud, el tipo acepta cadenas de cualquier tamaño. Este último es una extensión de PostgreSQL.

Además, PostgreSQL proporciona la text type, que almacena cadenas de cualquier longitud. Aunque el tipo text no está en el estándar SQL, varios otros sistemas de administración de bases de datos SQL también lo tienen.

Valores de tipo character están físicamente acolchados con espacios hasta el ancho especificado n, y se almacenan y muestran de esa manera. Sin embargo, los espacios finales se tratan como semánticamente insignificantes y se ignoran al comparar dos valores de tipo character. En intercalaciones donde los espacios en blanco son importantes, este comportamiento puede producir resultados inesperados; por ejemplo SELECT 'a '::CHAR(2) collate "C" < E'an'::CHAR(2) devoluciones true, aunque C locale consideraría que un espacio es mayor que una nueva línea. Los espacios finales se eliminan al convertir un character valor para uno del otro string tipos. Tenga en cuenta que los espacios finales están semánticamente significativo en character varying y text valores, y cuando se utiliza la coincidencia de patrones, es LIKE y expresiones regulares.

Los caracteres que se pueden almacenar en cualquiera de estos tipos de datos están determinados por el juego de caracteres de la base de datos, que se selecciona cuando se crea la base de datos. Independientemente del juego de caracteres específico, el carácter con código cero (a veces llamado NUL) no se puede almacenar. Para obtener más información, consulte la Sección 23.3.

El requisito de almacenamiento para un corto string (hasta 126 bytes) es 1 byte más el valor real string, que incluye el espacio acolchado en el caso de character. Las cadenas más largas tienen 4 bytes de sobrecarga en lugar de 1. El sistema comprime las cadenas largas automáticamente, por lo que el requisito físico en el disco puede ser menor. Los valores muy largos también se almacenan en tablas de fondo para que no interfieran con el acceso rápido a valores de columna más cortos. En cualquier caso, el personaje más largo posible string que se puede almacenar es de aproximadamente 1 GB. (El valor máximo que se permitirá para n en la declaración del tipo de datos es menor que eso. No sería útil cambiar esto porque con codificaciones de caracteres multibyte el número de caracteres y bytes puede ser bastante diferente. Si desea almacenar cadenas largas sin límite superior específico, utilice text o character varying sin un especificador de longitud, en lugar de crear un límite de longitud arbitrario).

Propina

No hay diferencia de rendimiento entre estos tres tipos, aparte del mayor espacio de almacenamiento cuando se usa el tipo con relleno en blanco, y algunos ciclos de CPU adicionales para verificar la longitud cuando se almacena en una columna de longitud limitada. Tiempo character(n) tiene ventajas de rendimiento en algunos otros sistemas de bases de datos, no existe tal ventaja en PostgreSQL; De hecho character(n) suele ser el más lento de los tres debido a sus costos de almacenamiento adicionales. En la mayoría de situaciones text o character varying debe usarse en su lugar.

Consulte la Sección 4.1.2.1 para obtener información sobre la sintaxis de string literales, y para Capítulo 9 para obtener información sobre los operadores y las funciones disponibles.

Ejemplo 8.1. Usando los tipos de caracteres

CREATETABLE test1 (a character(4));INSERTINTO test1 VALUES('ok');SELECT a, char_length(a)FROM test1;-- (1)

  a   | char_length
------+-------------
 ok   |2CREATETABLE test2 (b varchar(5));INSERTINTO test2 VALUES('ok');INSERTINTO test2 VALUES('good      ');INSERTINTO test2 VALUES('too long');
ERROR:  value too long fortypecharactervarying(5)INSERTINTO test2 VALUES('too long'::varchar(5));-- explicit truncationSELECT b, char_length(b)FROM test2;

   b   | char_length
-------+-------------
 ok    |2
 good  |5
 too l |5

(1)

los char_length La función se discute en la Sección 9.4.

Hay otros dos tipos de caracteres de longitud fija en PostgreSQL, que se muestran en la Tabla 8.5. los name el tipo existe solamente para el almacenamiento de identificadores en los catálogos internos del sistema y no está destinado a ser utilizado por el usuario general. Su longitud se define actualmente como 64 bytes (63 caracteres utilizables más terminador), pero se debe hacer referencia a ella mediante la constante NAMEDATALEN en C código fuente. La longitud se establece en tiempo de compilación (y por lo tanto es ajustable para usos especiales); la longitud máxima predeterminada puede cambiar en una versión futura. El tipo "char" (tenga en cuenta las comillas) es diferente de char(1) ya que solo usa un byte de almacenamiento. Se utiliza internamente en los catálogos del sistema como un tipo de enumeración simplista.

Cuadro 8.5. Tipos de caracteres especiales

Nombre Tamaño de almacenamiento Descripción
"char" 1 byte tipo interno de un solo byte
name 64 bytes tipo interno para nombres de objeto
Anterior Hasta próximo
8.2. Tipos monetarios Hogar 8.4. Tipos de datos binarios