8.3. Tipos de caracteres

Tabla 8-4. Tipos de caracteres

Nombre Descripción
carácter variable(n), varchar(n) longitud variable con límite
carácter(n), char(n) longitud fija, relleno en blanco
texto variable de longitud ilimitada

La tabla 8-4 muestra los tipos de caracteres de propósito general disponibles enPostgreSQL.

SQL define dos tipos de caracteres primarios: character varying(n) y character(n), dondeeren es un entero positivo. Ambos tipos pueden almacenar cadenas de hasta n caracteres (no bytes) de longitud. Un intento de almacenar una cadena más larga en una columna de estos tipos dará lugar a un error, a menos que los caracteres sobrantes sean todos espacios, en cuyo caso la cadena se truncará hasta la longitud máxima (esta excepción un tanto extraña es requerida por el estándar SQL).) Si la cadena que se va a almacenar es más corta que la longitud declarada, los valores de tipo character serán rellenados con espacios; los valores de tipoecharacter varying simplemente almacenarán la cadena más corta.

Si uno explícitamente lanza un valor a charactervarying(n) o character(n), entonces un valor de longitud excesiva será truncado a n caracteres sin que se produzca un error. (Esto es requerido por el estándar SQL.)

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

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

Los valores del tipo character se rellenan físicamente con espacios hasta el ancho n especificado, y se almacenan y muestran de esa manera.Sin embargo, los espacios de relleno se tratan como semánticamente insignificantes. Los espacios finales no se tienen en cuenta cuando se comparan dos valores de tipo carácter, y se eliminan cuando se convierte un valor de carácter en uno de los otros tipos de cadena. Tenga en cuenta que los espacios al final de la cadena son semánticamente significativos en los valores de caracteres y de texto, y cuando se utiliza la coincidencia de patrones, por ejemplo, LIKE, expresiones regulares.

El requisito de almacenamiento para una cadena corta (hasta 126 bytes) es de 1 byte más la cadena real, que incluye el espacio de relleno en el caso de los caracteres. Las cadenas más largas tienen 4 bytes de sobrecarga en lugar de 1. Las cadenas largas son comprimidas por el sistema 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, la cadena de caracteres más larga posible que se puede almacenar es de aproximadamente 1 GB. (El valor máximo que se permitirá paran en la declaración del tipo de datos es menor que eso. No sería útil cambiar esto porque con las codificaciones de caracteres multibyte el número de caracteres y de bytes puede ser muy diferente. Si desea almacenar cadenas largas con un límite superior inespecífico, utilice texto o caracteres que varíen sin un especificador de longitud, en lugar de inventar un límite de longitud arbitrario.)

Consejo: No hay ninguna diferencia de rendimiento entre estos tres tipos, aparte de un mayor espacio de almacenamiento cuando se utiliza el tipo con relleno en blanco, y unos pocos ciclos de CPU adicionales para comprobar la longitud cuando se almacena en una columna con restricciones de longitud. Mientras que character(n) tiene ventajas de rendimiento en algunos otros sistemas de bases de datos, no hay tal ventaja en PostgreSQL; de hecho, character(n) suele ser el más lento de los tres debido a sus costes adicionales de almacenamiento. En la mayoría de las situaciones, se debería utilizartext o charactervarying en su lugar.

Consulte la Sección 4.1.2.1 para obtener información sobre la sintaxis de los literales de cadena, y el Capítulo 9 para obtener información sobre los operadores y funciones disponibles. El conjunto de caracteres de la base de datos determina el conjunto de caracteres utilizado para almacenar los valores textuales; para más información sobre el soporte del conjunto de caracteres, consulte la Sección 22.3.

Ejemplo 8-1. Uso de los tipos de caracteres

CREATE TABLE test1 (a character(4));INSERT INTO test1 VALUES ('ok');SELECT a, char_length(a) FROM test1; -- (1) a | char_length------+------------- ok | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO 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) La función char_length se discute en la Sección 9.4.

Hay otros dos tipos de caracteres de longitud fija en PostgreSQL, mostrados en la Tabla8-5. El tipo de nombre existe sólo 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 está actualmente definida como 64 bytes (63usables caracteres más el terminador) pero debe ser referenciada usando la constante NAMEDATALEN en el código fuente C. La longitud se establece en tiempo de compilación (y por lo tanto es ajustable para usos especiales); la longitud máxima por defecto podría cambiar en una futura versión. El tipo “char” (nótese las comillas) se diferencia de char(1) en que sólo utiliza un byte de almacenamiento. Se utiliza internamente en los catálogos del sistema como un tipo de enumeración simplista.

Tabla 8-5. Tipos de caracteres especiales

Nombre Tamaño de almacenamiento Descripción
“char” 1 byte simple-byte tipo interno
nombre 64 bytes tipo interno para nombres de objetos

Deja una respuesta

Tu dirección de correo electrónico no será publicada.