Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi Carattere
PrecedenteTipi MonetariTipi di dato binariSuccessivo

8.3. Tipi Carattere

Tabella 8.4. Character Types

NomeDescrizione
character varying(n), varchar(n)lunghezza variabile, con limite
character(n), char(n)lunghezza fissa, completata con blank
textlunghezza variabile illimitata

La Tabella 8.4, «Character Types» mostra i tipi di dato di caratteri di utilizzo generale disponibili in PostgreSQL™.

SQL definisce due tipi primari di caratteri: character varying(n) e character(n), dove n è un intero positivo. Ambedue questi tipi possono memorizzare stringhe fino a n caratteri di lunghezza. Un tentativo di memorizzare una stringa più lunga in una colonna di questi tipi provocherà un errore, a meno che i caratteri eccedenti non siano tutti spazi, in questo caso la stringa verrà troncata alla lunghezza massima. (Questa eccezione un pò bizzarra è richiesta dallo standard SQL). Se la stringa da memorizzare è più corta della lunghezza dichiarata, nei valori di tipo character la parte eccedente sarà completata con spazi; nei valori di tipo character varying la stringa verrà semplicemente memorizzata con la sua lunghezza più corta.

Se si effettua una conversione esplicita di un valore a character varying(n) o character(n), un eventuale eccesso di lunghezza del valore verrà troncato a n caratteri senza generare un errore. (Anche questo è richiesto dallo standard SQL).

Le notazioni varchar(n) e char(n) sono, rispettivamente, alias per character varying(n) e character(n). Il tipo character senza specificatore di lunghezza è equivalente a character(1). Se character varying viene usato senza specificatore di lunghezza, accetterà stringhe di qualsiasi lunghezza. Quest'ultima è un'estensione di PostgreSQL™.

Inoltre, PostgreSQL™ fornisce il tipo text, il quale memorizza stringhe di qualsiasi lunghezza. Anche se il tipo text non è nello standard SQL, diversi altri sitemi di gestione database SQL lo hanno adottato.

I valori di tipo character vengono fisicamente completati con spazi fino alla larghezza specificata n, e vengono memorizzati e visualizzati in questo modo. Tuttavia gli spazi riempitivi sono trattati come semanticamente insignificanti. Gli spazi accodati non vengono presi in considerazione quando si confrontano due valori di tipo character, e vengono invece eliminati quando si converte un valore di tipo character a uno degli altri tipi stringa. Notare che gli spazi accodati sono semanticamente significativi nei valori character varying e text.

La memoria richiesta per una stringa corta (fino a 126 byte) è di 1 byte più la stringa effettiva, che comprende gli spazi riempitivi nel caso di character. Stringhe più lunghe hanno 4 byte in testa invece di di 1. Le stringhe lunghe vengono automaticamente compresse dal sistema, per cui la lunghezza fisica richiesta su disco potrebbe essere minore. Valori molto lunghi vengono anche memorizzati in tabelle di background in modo che non interferiscano con l'accesso rapido a valori di colonna più corti. In ogni caso, la più lunga stringa di caratteri che può essere memorizzata è di circa 1 GB. (Il valore massimo consentito per n nella dichiarazione del tipo dato è inferiore a questo. Non sarebbe molto utile cambiare questo comportamento perchè con la codificazione di caratteri multibyte, il numero di caratteri e di byte può essere comunque abbastanza diverso. Se si desidera memorizzare stringhe lunghe con nessun limite superiore specificato, usare text o character varying senza specificatore di lunghezza, piuttosto che impostare un limite di lunghezza arbitrario).

[Suggerimento]

Suggerimento

Non ci sono differenze di prestazioni tra questi tre tipi, a prescindere dalla maggiore dimensione di memorizzazione quando si utilizza il tipo con spazi riempitivi, e alcuni cicli CPU supplementari per controllare la lunghezza quando si memorizzano in colonne a lunghezza vincolata. Mentre in alcuni altri sistemi di database, character(n) ha vantaggi nelle prestazioni, esso non ha gli stessi vantaggi in PostgreSQL™; Infatti character(n) è solitamente il più lento dei tre, causa il costo del suo spazio di immagazzinamento aggiuntivo. Nella maggior parte delle situazioni dovrebbero invece essere usati text o character varying.

Vedere Sezione 4.1.2.1, «Costanti stringa» per informazioni circa la sintassi delle stringhe, e in Capitolo 9, Funzioni e Operatori per informazioni circa gli operatori e le funzioni disponibili. Il set di caratteri del database determina il set di caratteri usato per memorizzare valori testuali; per ulteriori informazioni sul set di caratteri supportato, vedere in Sezione 22.2, «Character Set Support».

Esempio 8.1. Utilizzare i tipi di carattere

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- 1

  a   | char_length
------+-------------
 ok   |           2


CREATE 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 truncation
SELECT b, char_length(b) FROM test2;

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

1

La funzione char_length è discussa dentro Sezione 9.4, «Funzioni e operatori sulle stringhe».


There are two other fixed-length character types in PostgreSQL™, shown in Tabella 8.5, «Tipi Carattere Speciali». The name type exists only for the storage of identifiers in the internal system catalogs and is not intended for use by the general user. Its length is currently defined as 64 bytes (63 usable characters plus terminator) but should be referenced using the constant NAMEDATALEN in C source code. The length is set at compile time (and is therefore adjustable for special uses); the default maximum length might change in a future release. The type "char" (note the quotes) is different from char(1) in that it only uses one byte of storage. It is internally used in the system catalogs as a simplistic enumeration type. Ci sono altri due tipi carattere a lunghezza fissa in PostgreSQL™, mostrati nella Tabella 8.5, «Tipi Carattere Speciali». Il tipo name esiste solo per memorizzazioni di identificatori lunghi nei cataloghi di sistema e non è destinato per un uso generale degli utenti. La sua lunghezza è attualmente definita di 64 byte (63 caratteri usabili più il terminatore) ma dovrebbe essere referenziata usando la costante NAMEDATALEN nel codice sorgente C . La lunghezza è impostata al momento della compilazione (ed è quindi adattabile per usi speciali); La lunghezza massima preimpostata potrebbe essere cambiata in un futuro rilascio. Il tipo "char" (notare gli apici) è diverso da char(1) in quanto

[Nota]

Nota

Nota per il revisore: enumerazione semplicistica? - testo originale: It is internally used in the system catalogs as a simplistic enumeration type.

usa solo un byte di memorizzazione. Viene usato internamente nei cataloghi di sistema come tipo di enumerazione semplicistica.

Tabella 8.5. Tipi Carattere Speciali

NomeDimensioneDescrizione
"char"1 bytetipo interno a 1-byte
name64 bytestipo interno per i nomi di oggetti

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi Carattere
PrecedenteTipi MonetariTipi di dato binariSuccessivo