8.3. Tipuri de caractere

Tabelul 8-4. Tipuri de caractere

Nume Descriere
caracter variabil(n), varchar(n) lungime variabilă cu limită
caracter(n), char(n) lungime fixă, blank padded
text variabilă cu lungime nelimitată

Tabelul8-4 prezintă tipurile de caractere de uz general disponibile înPostgreSQL.

SQL definește două tipuri de caractere primare: character varying(n) și character(n), underen este un număr întreg pozitiv. Ambele tipuri pot stoca șiruri de până la n caractere (nu octeți) în lungime. O încercare de a stoca un șir mai lung într-o coloană din aceste tipuri va duce la o eroare, cu excepția cazului în care caracterele în exces sunt toate spații, caz în care șirul va fi trunchiat la lungimea maximă (această excepție oarecum bizară este impusă de standardul SQL).) Dacă șirul care urmează să fie stocat este mai scurt decât lungimea declarată, valorile de tip character vor fi completate cu spații; valorile de tip character varying vor stoca pur și simplu șirul mai scurt.

Dacă o valoare este transformată în mod explicit în charactervarying(n) sau character(n), atunci o valoare cu o lungime mai mare decât cea declarată va fi trunchiată la n caractere fără a genera o eroare. (Acest lucru este cerut de standardul SQL.)

Notațiile varchar(n) și char(n) sunt pseudonime pentru character varying(n)și, respectiv, character(n). character fără specificator de lungime este echivalent cucharacter(1). În cazul în care se utilizează charactervarying fără specificator de lungime, tipul acceptă șiruri de orice dimensiune. Acesta din urmă este o extensie PostgreSQL.

În plus, PostgreSQL oferă tipul text, care stochează șiruri de caractere de orice lungime. Deși tipul text nu face parte din standardul SQL, mai multe alte sisteme de gestionare a bazelor de date SQL îl au și ele.

Valorile de tip caracter sunt umplute fizic cu spații până la lățimea n specificată și sunt stocate și afișate în acest fel.Cu toate acestea, spațiile de umplere sunt tratate ca fiind nesemnificative din punct de vedere semantic. Nu se ține seama de spațiile de urmărire atunci când se compară două valori de tip caracter, iar acestea vor fi eliminate atunci când se convertește o valoare de tip caracter într-unul dintre celelalte tipuri de șiruri. Rețineți că spațiile finale sunt semnificative din punct de vedere semantic în cazul valorilor de variație a caracterelor și a valorilor textului, precum și atunci când se utilizează potrivirea modelelor, de exemplu LIKE, expresii regulate.

Necesarul de stocare pentru un șir scurt (până la 126 de octeți) este de 1 octet plus șirul propriu-zis, care include spațiile de umplutură în cazul unui caracter. Șirurile mai lungi au 4 octeți de suprasarcină în loc de 1. Șirurile lungi sunt comprimate automat de către sistem, astfel încât necesarul fizic pe disc poate fi mai mic. Valorile foarte lungi sunt, de asemenea, stocate în tabele de fundal, astfel încât să nu interfereze cu accesul rapid la valorile mai scurte ale coloanelor.În orice caz, cel mai lung șir de caractere care poate fi stocat este de aproximativ 1 GB. (Valoarea maximă care va fi permisă în declarația tipului de date este mai mică decât aceasta. Nu ar fi util să modificăm acest lucru deoarece, în cazul codurilor de caractere multibyte, numărul de caractere și de octeți poate fi foarte diferit. Dacă doriți să stocați șiruri lungi cu o limită superioară nespecifică, folosiți text sau caractere variate fără un specificator de lungime, în loc să inventați o limită de lungime arbitrară.)

Tip: Nu există nici o diferență de performanță între aceste trei tipuri, în afară de creșterea spațiului de stocare atunci când se folosește tipul “blank-padded” și câteva cicluri suplimentare de CPU pentru a verifica lungimea atunci când se stochează într-o coloană cu limită de lungime. În timp ce character(n) are avantaje de performanță în alte sisteme de baze de date, nu există un astfel de avantaj în PostgreSQL; de fapt, character(n) este de obicei cel mai lent dintre cele trei tipuri din cauza costurilor suplimentare de stocare. În cele mai multe situații ar trebui să se folosească în schimb text sau charactervarying.

Referiți-vă la secțiunea 4.1.2.1 pentru informații despre sintaxa literaliilor de șiruri de caractere și laCapitolul 9 pentru informații despre operatorii și funcțiile disponibile. Setul de caractere al bazei de datedetermină setul de caractere utilizat pentru a stoca valorile textuale; pentru mai multeinformații privind suportul seturilor de caractere, consultați secțiunea 22.3.

Exemplu 8-1. Utilizarea tipurilor de caractere

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) Funcția char_length estediscutată în secțiunea 9.4.

Există alte două tipuri de caractere de lungime fixă în PostgreSQL, prezentate în Tabelul8-5. Tipul nume există doar pentru stocarea identificatorilor în cataloagele sistemului intern și nu este destinat utilizării de către utilizatorul general. Lungimea sa este definită în prezent ca fiind de 64 de octeți (63 de caractere utilizabile plus terminatorul), dar ar trebui să se facă referire la el folosind constanta NAMEDATALEN în codul sursă C. Lungimea este stabilită în momentul compilării (și, prin urmare, este ajustabilă pentru utilizări speciale); lungimea maximă implicită ar putea fi modificată într-o versiune viitoare. Tipul “char” (a se observa ghilimelele) este diferit de char(1) prin faptul că utilizează doar un octet de stocare. Este utilizat intern în cataloagele de sistem ca un tip de enumerare simplist.

Tabel 8-5. Tipuri de caractere speciale

Nume Dimensiunea de stocare Descriere
“char” 1 octet singur-.byte tip intern
nume 64 octeți tip intern pentru nume de obiecte

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.