Tabella 8-4. Tipi di carattere
Nome | Descrizione |
---|---|
carattere variabile(n), varchar(n) | lunghezza variabile con limite |
carattere(n), char(n) | lunghezza fissa, vuoto imbottito |
testo | lunghezza variabile illimitata |
Tabella8-4 mostra i tipi di carattere per uso generale disponibili in PostgreSQL.
SQL definisce due tipi di carattere primari: carattere variabile(n) e carattere(n), doveeren è un intero positivo. Entrambi questi tipi possono memorizzare stringhe fino a n caratteri (non byte) di lunghezza. Un tentativo di memorizzare una stringa più lunga in una colonna di questi tipi risulterà in un errore, a meno che i caratteri in eccesso siano tutti spazi, nel qual caso la stringa sarà troncata alla lunghezza massima (questa eccezione un po’ bizzarra è richiesta dallo standard SQL).Se la stringa da memorizzare è più corta della lunghezza dichiarata, i valori di tipo character saranno riempiti di spazio; i valori di tipo character che variano memorizzeranno semplicemente la stringa più corta.
Se si lancia esplicitamente un valore a charactervarying(n) o character(n), allora un valore in eccesso sarà troncato a n caratteri senza sollevare un errore. (Questo è richiesto dallo standard SQL.)
Le notazioni varchar(n) e char(n) sono alias rispettivamente per charactervarying(n)e character(n). character senza specificatore di lunghezza è equivalente acharacter(1). Se charactervarying è usato senza specificatore di lunghezza, il tipo accetta stringhe di qualsiasi dimensione. Quest’ultimo è un’estensione di PostgreSQL.
Inoltre, PostgreSQL fornisce il tipo text, che memorizza stringhe di qualsiasi lunghezza. Anche se il tipo testo non è nello standard SQL, molti altri sistemi di gestione di database SQL lo hanno.
I valori di tipo carattere sono fisicamente riempiti di spazi fino alla larghezza n specificata, e sono memorizzati e visualizzati in questo modo.Tuttavia, gli spazi di riempimento sono trattati come semanticamente insignificanti. Gli spazi d’interruzione sono ignorati quando si confrontano due valori di tipo carattere, e saranno rimossi quando si converte un valore di carattere in uno degli altri tipi di stringa. Si noti che gli spazi finali sono semanticamente significativi nella variazione dei caratteri e nei valori di testo, e quando si usa la corrispondenza di pattern, ad esempio LIKE, espressioni regolari.
Il requisito di memorizzazione per una stringa corta (fino a 126 byte) è 1 byte più la stringa vera e propria, che include lo spazio di riempimento nel caso del carattere. Le stringhe più lunghe hanno 4 byte di overhead invece di 1. Le stringhe lunghe sono compresse automaticamente dal sistema, quindi il requisito fisico su disco potrebbe essere inferiore. I valori molto lunghi sono anche memorizzati in tabelle di sfondo in modo che non interferiscano con l’accesso rapido ai valori delle colonne più brevi.In ogni caso, la stringa di caratteri più lunga possibile che può essere memorizzata è di circa 1 GB (il valore massimo che sarà consentito nella dichiarazione del tipo di dati è inferiore a questo. Non sarebbe utile cambiare questo perché con le codifiche di caratteri multibyte il numero di caratteri e di byte può essere molto diverso. Se desiderate memorizzare lunghe stringhe con un limite superiore nospecifico, usate testo o caratteri che variano senza uno specificatore di lunghezza, piuttosto che inventare un limite di lunghezza arbitrario.)
Suggerimento: non c’è differenza di prestazioni tra questi tre tipi, a parte un aumento dello spazio di memorizzazione quando si usa il tipoblank-padded, e qualche ciclo CPU extra per controllare la lunghezza quando si memorizza in una colonna con limiti di lunghezza. Mentre character(n) ha vantaggi di performance in alcuni altri sistemi di database, non c’è un tale vantaggio in PostgreSQL; infatti character(n) è di solito il più lento dei tre a causa dei suoi costi di memorizzazione aggiuntivi. Nella maggior parte delle situazioni si dovrebbe usare invece il testo o il caratterevariante.
Riferimento alla Sezione 4.1.2.1 per informazioni sulla sintassi dei letterali di stringa, e alCapitolo 9 per informazioni sugli operatori e le funzioni disponibili. Il set di caratteri del database determina il set di caratteri usato per memorizzare valori testuali; per maggiori informazioni sul supporto dei set di caratteri, fare riferimento alla Sezione 22.3.
Esempio 8-1. Uso dei 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 | 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
char_length
è discussa nella sezione 9.4. Ci sono altri due tipi di carattere a lunghezza fissa in PostgreSQL, mostrati nella Tabella 8-5. Il tipo name esiste solo per la memorizzazione di identificatori nei cataloghi interni del sistema e non è destinato all’uso da parte dell’utente generale. La sua lunghezza è attualmente definita come 64 byte (63 caratteri più il terminatore) ma dovrebbe essere referenziata usando la costante NAMEDATALEN nel codice sorgente C. La lunghezza è impostata al momento della compilazione (ed è quindi regolabile per usi speciali); la lunghezza massima predefinita potrebbe cambiare in una versione futura. Il tipo “char” (notare le virgolette) è diverso da char(1) in quanto usa solo un byte di memoria. È usato internamente nei cataloghi di sistema come un tipo di enumerazione semplicistico.
Tabella 8-5. Tipi di caratteri speciali
Nome | Dimensione della memoria | Descrizione |
---|---|---|
“char” | 1 byte | singolo-byte tipo interno |
nome | 64 byte | tipo interno per nomi di oggetti |