Documente Academic
Documente Profesional
Documente Cultură
Mysql 100 p-3
Mysql 100 p-3
Categoriile generale de valori pe care le poate reprezenta MySQL, inclusiv valoarea NULL.
Tipurile concrete de date pe care le furnizeaz MySQL pentru coloanele tabelelor, precum i proprietile care
caracterizeaz fiecare tip de coloan. Unele dintre tipurile de coloane MySQL au un caracter destul de general,
cum este tipul sir CHAR. Alte tipuri, cum este TIMESTAMP, au comportri speciale, pe care trebuie s le
nelegei pentru a evita surprizele.
Alegerea adecvat a tipului de coloan pentru tabelele dumneavoastr. Este important s tii modul de a alege
tipul cel mai adecvat intereselor dumneavoastr cnd construii un tabel, precum i s alegei ntre un tip i altul
atunci cnd se pot aplica mai multe tipuri pentru categoria de valori pe care dorii s o stocai.
Regulile MySQL pentru evaluarea expresiilor. MySQL ofer o gam larg de operatori i funcii pe care le
putei folosi pentru a regsi, afia i manipula date. Regulile pentru evaluarea expresiilor includ regulile care
controleaz conversiile de tip, atunci cnd o valoare de un tip este folosit ntr-un context care impune o valoare
de un alt tip.
Este important s nelegei cnd se produce i cum funcioneaz conversia de tip; unele conversii nu au nici un
sens si genereaz valori fr nici o semnificaie. Prin repartizarea irului "13" ntr-o coloan ntreag se obine
valoarea 13, dar repartizarea irului "abc" n coloana respectiv are ca rezultat valoarea O, deoarece "abc" nu
arat ca un numr. Mai ru, dac efectuai o comparaie fr a cunoate regulile de conversie putei provoca
pagube serioase, cum ar fi actualizarea sau tergerea tuturor rndurilor dintr-un tabel atunci cnd intenionai s
modificai numai cteva rnduri.
Dou anexe conin informaii suplimentare despre tipurile de coloane, operatorii i funciile MySQL. Acestea
sunt Anexa B, Referin de tipuri de coloane", respectiv Anexa C, Referin de operatori i funcii".
Tipuri de date MySQL
MySQL cunoate" numeroase tipuri de date, n spe categorii generale n care pot fi reprezentate diverse valori.
Valori numerice
Numerele sunt valori precum 48 sau 193.62. MySQL nelege numere specificate ca ntregi (fr parte
fracionar) sau valori cu virgul mobil (cu parte fracionar). ntregii pot fi specificai n format zecimal sau
hexazecimal.
Un ntreg const dintr-o secven de cifre. Un ntreg specificat n form hexazecimal const din secvena Ox
urmat de una sau mai multe cifre hexazecimale (cuprinse ntre 0-9, respectiv a-f). De exemplu, OxOa este 10 n
format zecimal, iar Oxf f f f este 65535 n format zecimal. Cifrele hexazecimale non-numerice pot fi specificate
cu majuscule sau minuscule, dar secvena de nceput Ox nu poate fi scris sub forma OX. Cu alte cuvinte, OxOa
si OxOA sunt corecte, dar OXOa i OXOA nu sunt.
Un numr cu virgul mobil const dintr-o secven de cifre, o virgul de separare a prii fracionare i o alt
secven de cifre. Una dintre cele dou secvene de cifre poate fi vid, dar nu ambele simultan.
Capitolul 2 Lucrul cu date n MySQL i SQL 101
MySQL nelege notaia tiinific. Aceasta este indicat prin inseria imediat dup un numr ntreg sau n virgul
mobil a literei e sau E, unui caracter semn (+ sau -) i unui exponent ntreg. 1.34E+12 i 43.27e-1 reprezint
numere scrise n notaie tiinific corect. Pe de alt parte, 1.34E12 nu este scris corect, deoarece lipsete
caracterul semn naintea exponentului. Numerele hexazecimale nu pot fi folosite n notaiile tiinifice; caracterul
e care se afl la nceputul exponentului este, de asemenea, o cifr hexazecimal corect i astfel se pot crea
confuzii.
Numerele pot fi precedate de un semn minus (-) pentru a semnala o valoare negativ.
Valori ir (caracter)
irurile sunt valori ca "Bucureti, Romnia" sau "pacientul se simte mai bine". Pentru a delimita o valoare ir se
pot folosi ghilimele simple sau duble.
n interiorul irurilor se pot folosi numeroase secvene escape, care se pot folosi pentru a preciza caractere
speciale, aa cum se poate vedea n tabelul 2.1. Fiecare secven ncepe cu un caracter backslash (\) pentru a
semnifica o excepie temporar de la regulile obinuite de interpretare a caracterelor. Reinei c un octet NUL nu
este unul i acelai lucru cu o valoare NULL; NUL este un octet de valoare zero, n timp ce NULL semnific
absena unei valori.
Tabelul 2.1 Secvene escape din iruri
Secven Semnificaie
\o NUL (ASCII 0)
v Ghilimele simple
\" Ghilimele duble
\b tergere caracter anterior
\n Caracter linie nou
\r Retur de car
\t Caracter de tabulare
\\ Backslash
Pentru a include ghilimele ntr-un ir, putei proceda astfel:
Dublai ghilimelele, dac irul este inclus ntre ghilimele folosind acelai caracter:
'Anii "701
"El zise: ""Ti-am spus eul"""
ncadrai irul folosind celelalte ghilimele; n acest caz, nu dublai ghilimelele din ir:
"Anii '70"
'El zise: "Ti-am spus eul"'
Anulai semnificaia ghilimelelor cu un caracter backslash; aceast metod este aplicabil indiferent de tipul
ghilimelelor folosite pentru a ncadra irul;
'Anii \'70' 'Anii \'70"
102 Partea l Utilizarea general a sistemului MySQL
"El zise: \"Ti-am spus eul\""
'El zise: \"Ti-am spus eu!\"'
n contextele irurilor, se pot folosi constantele hexazecimale pentru a specifica valorile de tip ir. Sintaxa este
cea descris anterior pentru valorile numerice, dar perechile de cifre hexazecimale sunt interpretate drept coduri
ASCII si sunt convenite n caractere. Rezultatul este folosit sub form de ir. De exemplu, cnd este interpretat
sub form de ir, 0x616263 este "abc".
Valori de tip dat si or (temporale)
Datele si orele sunt valori precum " 1999 - 06 -17" sau " 12:30:43". De asemenea, MySQL nelege valorile
dat/or combinate, precum "1999-06-17 12:30:43". Reinei faptul c MySQL reprezint datele n ordinea an-
lun-zi. Acest lucru i surprinde deseori pe nceptorii n materie de MySQL, dei acest format este standardul
SQL ANSI. Putei afia valorile datelor n orice mod dorii folosind funcia DATE_FORMAT(), dar formatul de
afiare prestabilit afieaz mai nti anul, iar valorile de intrare trebuie specificate ncepnd cu anul.
Valoarea NULL
NULL este un fel de valoare fr tip", n general, este folosit cu semnificaia fr valoare", valoare
necunoscut", valoare lips", n afara domeniului", nici una din precedentele opiuni" i aa mai departe.
Putei insera valori NULL n tabele, le putei regsi din tabele i putei testa dac o valoare este sau nu NULL.
Nu putei efectua operaii aritmetice cu valori NULL. (Dac ncercai, rezultatul este NULL.)
Tipuri de coloane MySQL
Fiecare tabel dintr-o baz de date este alctuit dintr-una sau mai multe coloane. Cnd creai un tabel folosind o
instruciune CREATE TABLE, specificai un tip pentru fiecare coloan. Un tip de coloan este mai specific dect
un tip de date, care este numai o categorie general de genul numr" sau ir". Un tip de coloan caracterizeaz
cu exactitate categoria de valori pe care o poate conine o coloan a unui tabel dat, cum este SMALLINT sau
VARCHAR(32).
Tipurile de coloane MySQL reprezint mijloacele prin care descriei categoriile de valori pe care le conin
coloanele unui tabel, care, la rndul lor, determin modul n care MySQL trateaz aceste valori. De exemplu,
dac avei valori numerice, le putei stoca folosind un tip de coloan numeric sau ir, dar MySQL va trata
valorile oarecum diferit, n funcie de modul n care le stocai. Fiecare tip de coloan are numeroase
caracteristici:
Ce tip de valori putei stoca n coloana respectiv
Spaiul pe care l ocup valorile, precum i dac valorile sunt de lungime fix (toate valorile de acel tip ocup
aceeai cantitate de spaiu) sau de lungime variabil (cantitatea de spaiu depinde de valoarea particular stocat)
Modul de comparare si stocare a valorilor din tipul respectiv
Capitolul 2 Lucrul cu date n MySQL i SQL 103
Dac tipul respectiv accept sau nu valori NULL
Dac tipul respectiv poate fi indexat sau nu
Vom examina succint tipurile de coloan MySQL pentru a avea o imagine de ansamblu, dup care vom discuta
mai detaliat proprietile care caracterizeaz fiecare tip.
O examinare a tipurilor de coloane
MySQL furnizeaz tipuri de coloane pentru valori din toate categoriile generale de tipuri de date, cu excepia
valorii NULL. Valoarea NULL acoper toate tipurile, n sensul c posibilitatea unei coloane de a conine sau nu
valori NULL este tratat ca atribut de tip. MySQL are tipuri de coloane att pentru valorile ntregi, ct i pentru
cele cu virgul mobil, aa cum se poate vedea n tabelul 2.2. Coloanele ntregi pot fi cu sau fr semn. Un
atribut special permite valorilor din coloanele ntregi s fie generate automat, ceea ce este util n aplicaii care
impun numere dintr-o secven sau de identificare unice.
Tabelul 2.2 Tipuri de coloane numerice
Numele tipului
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
FLOAT
DOUBLE
DECIMAL
Semnificaie
Un ntreg foarte mic
Un ntreg mic
Un ntreg de dimensiune medie
Un ntreg standard
Un ntreg mare
Un numr cu virgul mobil n precizie simpl
Un numr cu virgul mobil n dubl precizie
Un numr cu virgul mobil, reprezentat sub form de ir
Tipurile de coloane ir din MySQL sunt prezentate n tabelul 2.3. irurile pot conine orice, chiar si date binare
arbitrare, cum sunt imaginile sau sunetele. irurile pot fi comparate n funcie de sensibilitatea lor la diferena
ntre majuscule i minuscule. De asemenea, putei efectua cu iruri stabilirea de corespondene cu un model. (De
fapt, n MySQL putei efectua stabilirea de corespondene cu un model pentru orice tip de coloane, dar aceast
operaie se execut cel mai frecvent cu tipuri ir.)
Tabelul 2.3 Tipuri de coloane ir _________________
Numele tipului
CHAR
VARCHAR
TINYBLOB
BLOB
MEDIUMBLOB
Semnificaie
Un ir de caractere de lungime fix Un ir de caractere de lungime variabil Un BLOB (obiect binar mare) foarte
mic Un BLOB mic Un BLOB de dimensiuni medii
Continuare
104 Partea l Utilizarea general a sistemului MySQL Tabelul 2.3 Continuare
Numele tipului
LONGBLOB
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
ENUM
SET
Semnificaie
Un BLOB de dimensiuni mari
Un ir text foarte mic
Un ir text mic
Un ir text de dimensiuni medii
Un ir text de mari dimensiuni
O enumerare; coloanelor li se poate atribui un membru al enumerrii
Un set; coloanelor li se pot atribui mai muli membri ai unui set
Tipurile date i or din MySQL sunt prezentate n tabelul 2.4. Pentru valori temporale, MySQL furnizeaz tipuri
pentru date (cu sau fr or), ore i amprente de timp (un tip special, care v permite s detectai data i ora
efecturii ultimei modificri ntr-o nregistrare). De asemenea, exist un tip pentru reprezentarea eficient a
valorilor anilor, atunci cnd nu avei nevoie de o dat complet.
Tabelul 2.4 Tipuri de coloane dat i or
Numele tipului Semnificaie
DATE O valoare pentru dat, n format "AAAA-LL -22'
TIME O valoare pentru or, n format 'hh:mm:ss'
DATETIME O valoare pentru dat si or, n format 'AAAA-LL -ZZ hh :mm:ss'
TIMESTAMP O valoare pentru amprenta de timp, n format AAAALLZZhhmmss
YEAR O valoare pentru an, n format AAAA
Pentru a crea un tabel, emitei o instruciune CREATE TABLE i specificai o list a coloanelor care alctuiesc
tabelul. Fiecare coloan are un nume i un tip, iar la fiecare tip se pot asocia mai multe atribute. Iat un exemplu
care creeaz un tabel denumit tabeluljneu, cu trei coloane, denumite f, c i i: CREATE TABLE tabeluljneu
f FLOAT(10,4),
C CHAR(15) NOT NULL DEFAULT "nimic",
i TINYINT UNSIGNED NULL
Sintaxa pentru declararea unei coloane este urmtoarea:
nume_col tip_col [atribute_coloana] [atribute_generale] Numele coloanei este dat de nume_col. Numele
coloanelor pot avea o lungime de maxi- "J mum 64 de caractere i pot fi alctuite din caractere alfanumerice,
precum si din carac-1 terul de subliniere i simbolul dolarului (n spe _ i $). Un nume de coloan poate J
ncepe cu orice caracter admis ntr-un nume, inclusiv cu o cifr. Totui, urt nume fltrjl poate fi compus integral
din cifre, deoarece astfel ar deveni practic confundabil cu unii
Capitolul 2 Lucrul cu date n MySQL i SQL 105
numr. Cuvinte precum SELECT, DELETE sau CREATE sunt rezervate i nu pot fi folosite drept nume de
coloan. Totui, numele funciilor (cuvinte precum POS i MI N) nu sunt rezervate si pot fi folosite.
Tipul de coloan tip_col precizeaz categoria exact de valori pe care le poate conine coloana. Specificatorul de
tip mai poate indica i lungimea maxim a valorilor pe care le stocai n coloan. Pentru unele tipuri, specificai
lungimea n mod explicit sub form numeric. Pentru altele, lungimea se deduce din numele tipului. De
exemplu, CHAR (10) specific o lungime explicit de 10 caractere, n timp ce valorile TINYBLOB au o lungime
maxim implicit de 255 caractere. Unii dintre specificatorii de tip v permit s indicai o lime maxim afiat
(numrul de caractere de utilizat pentru afiarea valorilor). Tipurile de coloane cu virgul mobil permit
specificarea numrului de cifre dup virgul, astfel nct s putei controla nivelul de precizie al valorilor.
Dup tipul coloanei, putei specifica atribute opionale specifice unui anumit tip, precum si atribute de ordin mai
general. Atributele funcioneaz ca modificatori de tip. Acestea determin programul MySQL s modifice ntr-un
fel sau altul tratamentul aplicat valorilor din coloan:
Atributele permise specifice tipului depind de tipul de coloan pe care l alegei. De exemplu, UNSIGNED este
permis numai pentru tipurile ntregi, iar BINARY este permis numai pentru tipurile CHAR si VARCHAR.
Atributele generale pot fi date pentru orice tip de coloan, cu anumite excepii. Putei specifica NULL sau NOT
NULL pentru a preciza dac o coloan poate conine sau nu valori NULL. De asemenea, putei specifica
DEFAULT valoare_prestabilita pentru a arta c o coloan trebuie s primeasc valoarea valoare_prestabilita
atunci cnd este creat un rnd nou fr a se specifica n mod explicit valoarea coloanei. Valoarea
valoare_prestabilita trebuie s fie o constant; nu poate fi o expresie i nici nu poate face referire la alte coloane.
Nu putei specifica o valoare prestabilit pentru coloanele BLOB sau TEXT.
Dac sunt precizate mai multe atribute specifice unei anumite coloane, acestea pot fi precizate n orice ordine, cu
condiia ca acestea s respecte tipul coloanei i s precead toate atributele generale. Similar, dac sunt date mai
multe atribute generale, ele pot fi specificate n orice ordine, cu condiia s respecte tipul coloanei i s fie
plasate dup toate atributele specifice de coloan existente.
n continuare, aceast seciune discut despre fiecare dintre tipurile de coloan MySQL, pentru a prezenta sintaxa
utilizat la declararea tipului i proprietile care o caracterizeaz, cum ar fi cerinele privind domeniul i
capacitatea de stocare. Specificaiile de tip sunt prezentate aa cum sunt utilizate acestea n instruciunile
CREATE TABLE. Informaiile opionale sunt ncadrate ntre paranteze drepte ([ ]). De exemplu, sintaxa
MEDIUMINT[ (M) ] arat c limea maxim de afiare, specificat sub forma (M), este opional. Pe de alt
parte, pentru CHAR (M), lipsa parantezelor arat c (M) este obligatorie.
Reprezentarea numeric a coloanelor SET este puin diferit de aceea a coloanelor ENUM. Membrii unui set nu
sunt numerotai secvenial, n schimb, fiecrui membru i corespunde unui bit individual n valoarea SET. Primul
membru al setului corespunde bitului O, al doilea membru corespunde bitului l etc. O valoare SET numeric
egal cu O corespunde irului vid. Membrii SET sunt stocai ca valori pe bii. n acest mod se pot stoca n fiecare
octet cte opt valori ale unui set, deci dimensiunea spaiului de stocare a unei coloane SET este determinat de
numrul de membri ai setului, pn la o valoare maxim de 64 de membri. Valorile SET pot ocupa l, 2,3,4 sau 8
octei pentru dimensiuni ale setului cuprinse respectiv ntre 1-8, 9-16, 17-24, 25-32 si 33-64.
Reprezentarea unei valori SET sub forma unui set de bii este cea care i permite unei asemenea valori s fie
alctuit din mai muli membri ai unui set. ntr-o valoare se poate stabili orice combinaie de bii, deci valoarea
poate fi alctuit din orice combinaie de iruri din declaraia SET care corespund acestor bii.
Iat un exemplu care ilustreaz relaia dintre forma ir si forma numeric a unei coloane SET; valoarea numeric
este afiat att n form zecimal, ct si n form binar:
mysql> CREATE TABLE s_tabel (s SET("ana-,"ion",-nae","ela"));
mysql> INSERT INTO s_tabel
VALUES("ana"), ("ion"), ("nae'),Cela"),("),(NULL);
mysql> SELECT s, s+0, BIN(s+0) FROM s_tabel;
s s+o BIN(s+0)
ana 1 1
ion 2 10
nae 4 100
ela 8 1000
0 0
NULL NULL NULL
Dac repartizai ntr-o coloan SET o valoare care conine sub-siruri ce nu au foti menionate ca membri ai
setului, aceste iruri sunt eliminate si n coloan este repartizat! o valoare care const din sub-irurile rmase.
Cnd repartizai valori n coloanele St,| nu este necesar ca sub-irurile s fie menionate n aceeai ordine pe
care ai folosit-oi atunci cnd ai declarat coloana. Totui, cnd regsii valoarea ulterior, membrii vor fii
menionai n ordinea de declarare. S presupunem c specificai o coloan SET pentru a| reprezenta articole de
mobilier, folosind urmtoarea declaraie:
Capitolul 2 Lucrul cu date n MySQL i SQL 125
SET("masa","lampa","scaun")
Dac repartizai n aceast coloan valoarea "scaun,canapea,masa", se vor ntmpla dou lucruri. Primul: irul
"canapea" dispare, deoarece nu este un membru al setului. Al doilea: cnd regsii valoarea ulterior, aceasta apare
sub forma" masa, scaun". Acest lucru se produce deoarece MySQL determin biii care corespund fiecrui sub-
ir al valorii care trebuie repartizate i i activeaz n cadrul valorii stocate. Sub-irul" canapea" nu corespunde
nici unui bit si este ignorat. La regsire, MySQL construiete valoarea irului din valoarea numeric prin
parcurgerea biilor n ordine, fapt care are ca efect reordonarea automat a sub-irurilor n ordinea folosit la
declararea coloanei. Aceast caracteristic mai are i urmtoarea semnificaie: dac specificai un membru al
setului de mai multe ori ntr-o valoare, acesta va aprea o singur dat la regsirea valorii. Dac repartizai
valoarea "lampa,lampa,lampa" ntr-o coloan SET, la regsire aceasta va avea numai valoarea " lampa".
Faptul c MySQL modific ordinea membrilor dintr-o valoare SET nseamn c, n cazul n care cutai valori
folosind un ir, trebuie s enumerai membrii n ordinea adecvat. Dac inserai "scaun,masa" si apoi cutai
"scaun,masa", nu vei gsi nimic; trebuie s cutai valoarea "masa, scaun".
Sortarea i indexarea coloanelor ENUM i SET se realizeaz n conformitate cu valorile interne (numerice) ale
valorilor din coloana. Exemplul urmtor ar putea prea altfel incorect, deoarece valorile nu sunt sortate n ordine
alfanumeric: mysql> SELECT e FROM e_tabel ORDER BY e;
NULL
ana ion nae ela
Valoarea NULL apare dup sortare naintea altor valori (sau dup acestea, la sortarea n ordine descendent).
Putei exploata sortarea ENUM dac avei un set fixat de valori i dorii s le sortai ntr-o anumit ordine.
Atribuii coloanei tipul ENUM cnd creai tabelul i menionai valorile din enumerare n declaraia coloanei, n
ordinea n care dorii s fie sortate.
Pentru situaii n care dorii ca o coloan ENUM s fie sortat n ordine lexicografic normal, putei converti
coloana ntr-un ir non-ENUM folosind CONCAT( )i sortnd rezultatul: mysql> SELECT CONCAT(e) AS
e_str FROM e_tabel ORDER BY e_str;
e_str NULL
ana ela ion nae
126 Partea l Utilizarea general a sistemului MySQL Atributele coloanelor de tip ir
Atributul BINARY poate fi specificat pentru tipurile CHAR i VARCHAR pentru a determina tratarea valorilor
din coloan sub form de iruri binare (adic sensibile la diferena ntre majuscule si minuscule n cazul
operaiunilor de comparare i sortare).
Atributele generale NULL sau NOT NULL pot fi specificate pentru oricare dintre tipurile ir. Dac nu specificai
nici unul din acestea, atributul prestabilit este NULL. Totui, declararea unei coloane de tip ir ca NOT NULL nu
mpiedic introducerea unui ir vid. O valoare vid este diferit de o valoare inexistent, deci nu facei greeala
de a crede c putei fora o coloan ir s conin valori nevide declarnd-o NOT NULL, n cazul n care cerei ca
valorile irurilor s fie nevide, aceasta este o restricie pe care trebuie s o impunei n cadrul propriilor
dumneavoastr aplicaii.
De asemenea, putei specifica o valoare prestabilit folosind atributul DEFAULT pentru toate coloanele de tip ir,
cu excepia tipurilor BLOB i TEXT. Dac nu specificai o valoare prestabilit, o asemenea valoare va fi aleas
n mod automat. Pentru coloanele care pot'; conine NULL, valoarea prestabilit este NULL. Pentru coloane care
nu pot conine NULL, valoarea prestabilit este irul vid, cu excepia tipului ENUM, unde valoarea prestabilit \
este primul membru al enumerrii. (Pentru SET, valoarea prestabilit ntr-o coloan care nu poate conine NULL
este de fapt setul vid, dar acesta este echivalent cu irul vid.)
Coloane de tip dat i or
MySQL furnizeaz numeroase tipuri de coloane pentru valorile temporale: DATE, DATETIME, j TIME,
TIMESTAMP i YEAR. Tabelul 2.9 prezint tipurile furnizate de MySQL pentru] declararea coloanelor care
conin valori pentru dat i or, precum i domeniul valorilor] permise pentru fiecare tip. Tipul YEAR a fost
introdus n MySQL versiunea 3.22. Celelalte j tipuri au fost prezente n toate versiunile MySQL. Dimensiunile
necesare ale spaiului dej stocare pentru fiecare tip sunt prezentate n tabelul 2.10.
Tabelul 2.9 Coloane de tip dat i or
Specificaia tipului Domeniu f
DATE ntre "1000-01-01" i "9999-12-31"
TIME ntre "-838:59:59" i "838:59:59" (
DATETIME ntre "1000-01-01 00:00:00" i "9999-12-31 23:59:59"
TIMESTAMP [(M)] ntre 19700101000000 i undeva n anul 2037
YEAR[(M)] ntre 1901 i 2155
^
Tabel 2.10 Dimensiunile spaiului de stocare necesare pentru coloanele de tip dat i oral Specificaia tipului
Dimensiuni necesare ale spaiului de stocare
DATE 3 octei (anterior versiunii MySQL 3.22,4 octei)
TIME 3 octei
DATETIME 8 OCtei
Capitolul 2 Lucrul cu date n MySQL i SQL 127
Specificaia tipului
TIMESTAMP YEAR
Dimensiuni necesare ale spaiului de stocare
4 octei 1 octet
Fiecare tip dat i or are o valoare " zero" care este stocat atunci cnd inserai o valoare care este incorect
pentru tipul respectiv, aa cum se poate vedea n tabelul 2.11. Aceast valoare este, de asemenea, valoarea
prestabilit pentru coloanele de tip dat i or care sunt declarate NOT NULL.
Tabelul 2.11 Valorile zero" pentru coloanele de tip dat i or
Specificaia tipului
DATE
TIME
DATETIME
TIMESTAMP
YEAR
Valoare zero"
"0000-00-00" "00:00:00"
"0000-00-00 00:00:00" OQOOOOOOOOOOOO 0000
MySQL reprezint ntotdeauna datele ncepnd cu anul, n conformitate cu specificaia ANSI. De exemplu, 3
decembrie 1999 este reprezentat sub forma "1999-12-03". MySQL este oarecum lejer privind modul n care
permite specificarea datelor de intrare. De exemplu, va converti valorile anilor compuse din dou cifre n valori
din patru cifre, iar dumneavoastr nu trebuie s furnizai un zero iniial pentru valorile lunilor i zilelor care sunt
mai mici dect 10. Totui, trebuie s specificai mai nti anul. Formatele cu care suntei mai obinuit, precum
"12/3/99" sau "3/12/99" vor fi interpretate incorect. Regulile folosite de MySQL pentru interpretarea datelor sunt
discutate n detaliu n paragraful Lucrul cu coloanele de tip dat i or".
Valorile de tip or sunt returnate conform fusului orar local al serverului; MySQL nu execut nici un fel de
modificri n funcie de fusul orar ale valorilor pe care le returneaz clientului.
Tipurile de coloane DATE, TIME i DATETIME
Tipurile DATE, TIME i DATETIME conin valori de date, ore i valori combinate de tip dat-or. Formatele
sunt "AAAA-LL-ZZ", "hh:mm:ss", "AAAA-LL-ZZ hh:mm:ss". Pentru tipul DATETIME, partea de dat i cea
de or sunt obligatorii; dac atribuiri o valoare DATE unei coloane DATETIME, MySQL adaug automat o parte
de or sub forma " 00:00:00".
MySQL trateaz ora din valorile DATETIME i TIME n moduri uor diferite. Pentru DATETIME, partea de or
reprezint o or din zi. Pe de alt parte, o valoare TIME reprezint timpul scurs (iat de ce domeniul este att de
mare si de ce sunt permise i valorile negative). Partea din extremitatea dreapt a valorii este considerat ca
indicnd secunde deci, dac inserai o valoare de or scurt" (incomplet definit), precum "12:30" ntr-o
coloan TIME, valoarea stocat este "00:12:30", ceea ce este interpretat sub.forma 12 minute, 30 de secunde".
Putei folosi coloanele de tip TIME pentru a reprezenta ora din zi dac dorii, dar nu uitai de aceast regul de
conversie dac dorii s evitai problemele. Pentru a insera valoarea 12 ore, 30 de minute", trebuie s o
specificai sub forma " 12:30:00".
128 Partea l Utilizarea general a sistemului MySQL Tipul de coloan TIMESTAMP
Coloanele TIMESTAMP reprezint valorile n formatul AAAALLZZhhmmss, cu un domeniu cuprins ntre
19700101000000 i undeva n anul 2037. Domeniul este legat de ora UNIX, unde prima zi din 1970 este ziua
zero", cunoscut i sub numele de epoc", nceputul lui 1970 determin extremitatea inferioar a domeniului
TIMESTAMP. Extremitatea superioar a domeniului corespunde limitei de 4 octei a orei UNIX, care poate
reprezenta valori i> anul 20376.
Tipul TIMESTAMP are aceast denumire (amprent de timp - N.T.) deoarece are proprietatea special de a
nregistra momentul crerii sau al modificrii unei nregistrri. Dac inserai o valoare NULL ntr-o coloan
TIMESTAMP, valoarea coloanei devine automat aceea a datei si orei curente. Acest lucru se ntmpl si atunci
cnd creai sau actualizai un rnd, dar nu atribuii coloanei nici o valoare explicit. Totui, numai prima coloan
TIMESTAMP dintr-un rnd este tratat n acest mod i, chiar i pentru prima coloan, putei anula aplicarea
amprentei de timp prin inseria n coloan a unei date i a unei ore explicite n locul valorii NULL.
Declaraia unei coloane TIMESTAMP poate include o specificaie pentru o lime maxim de afiare M. Tabelul
2.12 afieaz formatele de afiare pentru valorile permise ale lui M. Dac M este omis dintr-o declaraie
TIMESTAMP sau are o valoare egal cu O sau mai mare dect 14, coloana este tratat ca TIMESTAMP(14).
Valorile impare ale lui M cuprinse n intervalul 1-13 sunt asimilate urmtorului numr par imediat superior.
Tabelul 2.12 Formate de afiare pentru valorile TIMESTAMP Specificaia tipului
TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(10) TIMESTAMP(8) TIMESTAMP(6) TIMESTAMP(4)
TIMESTAMP(2)
Formatul de afiare
AAAALLZZhhmmss
AAAALLZZhhmm
AALLZZhhmm
AAAALLZZ
AALLZZ
AALL
AA
Limea de afiare pentru coloanele TIMESTAMP nu are nici o legtur cu dimensiunea spaiului de stocare sau
cu valorile stocate intern. Valorile TIMESTAMP sunt ntotdeauna stocate sub form de 4 octei i sunt folosite n
calcule cu precizie complet de 14 cifre, l indiferent de limea de afiare. Pentru a vedea acest lucru, s
presupunem ca declarai un tabel dup cum urmeaz, dup care inserai cteva rnduri n tabel i le regsii:
6 Limita superioar a valorilor TIMESTAMP va crete pe msur ce sistemele de operare vor fi modifi- J cate
pentru a extinde limita superioar a valorilor orei UNIX. Acesta este un aspect care trebuie abordat la nivelul
bibliotecii de sistem. MySQL va exploata aceste modificri pe msur ce acestea sunt efectuate. - N.A.
Capitolul 2 Lucrul cu date n MySQL i SQL 129
CREATE TABLE tabeluljneu
ts TIMESTAMP(8), i INT
INSERT INTO tabeluljneu VALUES(19990801120000,3) INSERT INTO tabeluljneu
VALUES(19990801120001,2) INSERT INTO tabeluljneu VALUES(19990801120002,1)
INSERT INTO tabeluljneu VALUES(19990801120003,0) SELECT * FROM tabeluljneu ORDER BY ts, i
Datele de ieire ale instruciunii SELECT se prezint astfel:
n aparen, rndurile sunt stocate ntr-o ordine greit - valorile din prima coloan sunt toate identice, deci se
pare c sortarea ar trebui s aranjeze rndurile n conformitate cu valorile din a doua coloan. Acest rezultat
aparent anormal se datoreaz faptului c MySQL sorteaz n funcie de valorile complete, cu 14 cifre, inserate n
coloana TIMESTAMP.
MySQL nu are nici un tip de coloane care s primeasc data i ora crerii nregistrrii i care s rmn imuabil
dup aceea. Dac dorii s realizai acest lucru, putei proceda n dou moduri:
Folosii o coloana TIMESTAMP. Cnd nregistrarea este creat pentru prima dat, atribuii coloanei valoarea
NULL pentru a o iniializa cu valoarea datei si a orei curente:
INSERT INTO nume_tabel (ts_col, ...) VALUES(NULL, ...) De fiecare dat cnd actualizai nregistrarea la o
dat ulterioar, atribuii n mod explicit coloanei valoarea pe care o are deja. Prin atribuirea unei valori explicite
se contracareaz mecanismul de aplicare a amprentei de timp, deoarece mpiedic actualizarea automat a valorii
coloanei:
UPDATE nume_tabel SET ts_col=ts_col WHERE ...
Folosii o coloan DATETIME. Cnd creai o nregistrare, iniializai coloana la valoarea NOW():
INSERT INTO nume_tabel (dt_col, ...) VALUES(NOW(), ...) La fiecare actualizare ulterioar a nregistrrii,
lsai coloana nemodificat:
UPDATE nutne_tabel SET /* orice IN AFARA DE coloana dt_col */ WHERE ... Dac dorii s folosii coloanele
TIMESTAMP pentru a pstra att o valoare a orei crerii, ct i a orei ultimei modificri, puteri face aceasta
folosind o coloan TIMESTAMP pentru valoarea orei modificrii, respectiv o alt coloan TIMESTAMP pentru
valoarea orei crerii. Verificai ca ora modificrii s fie inclus n prima coloan TIMESTAMP, astfel nct s fie
configurat cnd nregistrarea este creat sau modificat. Facei din coloana cu ora crerii cea de-a doua coloan
TIMESTAMP si iniializati-o la valoarea NOW() atunci cnd creai nregistrri noi. Astfel, valoarea sa va
reflecta momentul crerii nregistrrii i nu se va modifica ulterior.
v'tt&
. fif"
130 Partea l Utilizarea general a sistemului MySQL Tipul de coloan YEAR
YEAR este un tip de coloan pe un octet folosit pentru reprezentarea eficient a valorilor anilor. Domeniul de
valori este cuprins ntre 1901 i 2155. Putei folosi tipul YEAR atunci cnd dorii s stocai informaii despre
date calendaristice, dar avei nevoie numai de an, cum ar fi anul naterii, anul alegerii n funcia de preedinte si
altele. Cnd nu avei nevoie de o valoare de tip dat complet, YEAR este mult mai eficient din punctul de
vedere al spaiului utilizat dect alte tipuri de date.
Declaraia unei coloane YEAR poate include o specificare a limii de afiare M, care poate fi 4 sau 2. Dac M
este omis dintr-o declaraie de tip YEAR, valoarea prestabilit este 4.
TINYINT are aceeai dimensiune a spaiului de stocare ca si YEAR (un octet), dar nu i acelai domeniu. Pentru
a acoperi aceeai perioad de timp ca i YEAR folosind un tip ntreg, avei nevoie de un SMALLINT, care
necesit o cantitate dubl de spaiu. Dac intervalul de timp n ani pe care trebuie s-1 reprezentai coincide cu
domeniul tipului YEAR, cel din urm folosete spaiul ntr-un mod mai eficient dect SMALLINT. Un alt
avantaj al coloanei YEAR fa de o coloan cu valori ntregi este acela c MySQL va conveni valorile din dou
cifre n valori cu patru cifre, folosind regulile obinuite de ghicire" a anului din MySQL. De exemplu, 97 i 14
devin 1997, respectiv 2014. Totui, reinei c inseria valorii numerice 00 va avea ca rezultat stocarea valorii
0000, nu a valprii 2000. Dac dorii ca o valoare zero s fie convertit la 2000, trebuie s o specificai sub form
deir: "00".
Atributele coloanelor de tip dat i or
Nu exist nici un atribut specific coloanelor de tip dat i or. Atributele generale NULL sau J NOT NULL pot fi
specificate pentru oricare dintre tipurile dat i or. Dac nu specificai nicijj unul din aceste atribute, NULL este
cel prestabilit. De asemenea, putei specifica o valoare| prestabilit folosind atributul DEFAULT. Dac nu
specificai o valoare prestabilit, o aseme-| nea valoare va fi aleas automat. Valoarea prestabilit este NULL
pentru coloanele care pot conine NULL, n caz contrar, valoarea prestabilit pentru tipul respectiv este zero".
Lucrul cu coloane de tip dat i or
MySQL ncearc s interpreteze valorile de tip dat i or ntr-o varietate de formatei Valorile DATE pot fi
specificate n oricare din urmtoarele formate, inclusiv formele ir : numerice. Tabelul 2.13 prezint formatele
permise pentru fiecare dintre tipurile dat i or
Tabelul 2.13 Formate de intrare pentru coloanele de tip dat si or Tip
DATETIME, TIMESTAMP
Formate permise
AAAA-LL-ZZ hh:mm:ss" "AA-LL-ZZ hh:mm:ss" "AAAALLZZhhmmss" " AALLZZhhmmss"
AAAALLZZhhmmss AALLZZhhmmss
Capitolul 2 Lucrul cu date n MySQL i SQL 131
Tip
DATE
TIME
YEAR
Formate permise
"AAAA-Ll-ZZ"
"AA-LL-ZZ"
"AAAALLZZ"
"AALLZZ"
AAAALLZZ
AALLZZ
"hh:mm:ss"
"hhmmss"
hhmmss
11AA"
AAAA
AA
Formatele cu dou cifre pentru valoarea anului sunt interpretate folosind regulile descrise n seciunea
Interpretarea valorilor ambigui ale anilor". Pentru formate de tip ir care includ caractere de delimitare, nu
trebuie s folosii cratimele pentru date, respectiv caracterul dou puncte pentru ore. Ca delimitator poate fi
folosit orice semn de punctuaie. Interpretarea valorilor depinde de context, nu de delimitator. De exemplu, dei
orele sunt specificate de obicei folosind delimitatorul dou puncte, MySQL nu va interpreta o valoare care
conine acest caracter ca o or ntr-un context unde se ateapt o dat. n plus, pentru formatele de tip ir care
includ delimitatori, nu trebuie s specificai dou cifre pentru valorile lunilor, zilelor, orelor, minutelor sau
secundelor care sunt mai mici dect 10. Urmtoarele formate sunt toate echivalente ntre ele:
"2012-02-03 05:04:09" '
"2012-2-03 05:04:09"
"2012-2-3 05:04:09"
"2012-2-3 5:04:09"
"2012-2-3 5:4:09"
"2012-2-3 5:4:9"
Observai c valorile cu zerouri iniiale pot fi interpretate diferit, n funcie de faptul dac sunt specificate ca
iruri sau ca numere. irul "001231" va fi vzut ca o valoare cu ase cifre si va fi interpretat sub forma "2000-12-
31" pentru o coloan DATE, respectiv ca " 2000 -12 - 31 00:00:00" pentru o coloan DATETIME. Pe de alt
parte, numrul 001231 va fi asimilat cu 1231 dup ce a trecut" prin analizor, moment dup care interpretarea
devine problematic. Aceasta este o situaie unde cel mai bine este s furnizai o valoare de tip ir sau s folosii
o valoare complet determinat n cazul n care utilizai numere (adic 20001231 pentru DATE, respectiv
200012310000 pentru DATETIME).
n general, putei atribui la discreie valori ntre tipurile DATE, DATETIME si TIMESTAMP,
dei trebuie s inei cont de anumite restricii:
Dac repartizai o valoare DATETIME sau TIMESTAMP ntr-o coloan DATE, partea de or
este eliminat.