Sunteți pe pagina 1din 32

100 Partea l Utilizarea general a sistemului MySQL

Categoriile generale de valori pe care le poate reprezenta MySQL, inclusiv valoarea ULL!
"ipurile concrete de date pe care le #urnizeaz MySQL pentru coloanele ta$elelor, precum %i propriet&ile care
caracterizeaz #iecare tip de coloan! Unele dintre tipurile de coloane MySQL au un caracter destul de general,
cum este tipul sir C'()! (lte tipuri, cum este "*M+S"(MP, au comportri speciale, pe care tre$uie s le
,n&elege&i pentru a evita surprizele!
(legerea adecvat a tipului de coloan pentru ta$elele dumneavoastr! +ste important s %ti&i modul de a alege
tipul cel mai adecvat intereselor dumneavoastr c-nd construi&i un ta$el, precum %i s alege&i ,ntre un tip %i altul
atunci c-nd se pot aplica mai multe tipuri pentru categoria de valori pe care dori&i s o stoca&i!
)egulile MySQL pentru evaluarea e.presiilor! MySQL o#er o gam larg de operatori %i #unc&ii pe care le
pute&i #olosi pentru a regsi, a#i%a %i manipula date! )egulile pentru evaluarea e.presiilor includ regulile care
controleaz conversiile de tip, atunci c-nd o valoare de un tip este #olosit ,ntr/un conte.t care impune o valoare
de un alt tip!
+ste important s ,n&elege&i c-nd se produce %i cum #unc&ioneaz conversia de tip0 unele conversii nu au nici un
sens si genereaz valori #r nici o semni#ica&ie! Prin repartizarea %irului 1121 ,ntr/o coloan ,ntreag se o$&ine
valoarea 12, dar repartizarea %irului 1a$c1 ,n coloana respectiv are ca rezultat valoarea 3, deoarece 1a$c1 nu
arat ca un numr! Mai ru, dac e#ectua&i o compara&ie #r a cunoa%te regulile de conversie pute&i provoca
pagu$e serioase, cum ar #i actualizarea sau %tergerea tuturor r-ndurilor dintr/un ta$el atunci c-nd inten&iona&i s
modi#ica&i numai c-teva r-nduri!
4ou ane.e con&in in#orma&ii suplimentare despre tipurile de coloane, operatorii %i #unc&iile MySQL! (cestea
sunt (ne.a 5, 6)e#erin& de tipuri de coloane1, respectiv (ne.a C, 6)e#erin& de operatori %i #unc&ii1!
"ipuri de date MySQL
MySQL 6cunoa%te1 numeroase tipuri de date, ,n spe& categorii generale ,n care pot #i reprezentate diverse valori!
7alori numerice
umerele sunt valori precum 89 sau 1:2!;<! MySQL ,n&elege numere speci#icate ca ,ntregi =#r parte
#rac&ionar> sau valori cu virgul mo$il =cu parte #rac&ionar>! ,ntregii pot #i speci#ica&i ,n #ormat zecimal sau
?e.azecimal!
Un ,ntreg const dintr/o secven& de ci#re! Un ,ntreg speci#icat ,n #orm ?e.azecimal const din secven&a 3.
urmat de una sau mai multe ci#re ?e.azecimale =cuprinse ,ntre 0/:, respectiv a/#>! 4e e.emplu, 3.3a este 10 ,n
#ormat zecimal, iar 3.# # # # este ;@@2@ ,n #ormat zecimal! Ci#rele ?e.azecimale non/numerice pot #i speci#icate
cu maAuscule sau minuscule, dar secven&a de ,nceput 3. nu poate #i scris su$ #orma 3B! Cu alte cuvinte, 3.3a
si 3.3( sunt corecte, dar 3B3a %i 3B3( nu sunt!
Un numr cu virgul mo$il const dintr/o secven& de ci#re, o virgul de separare a pr&ii #rac&ionare %i o alt
secven& de ci#re! Una dintre cele dou secven&e de ci#re poate #i vid, dar nu am$ele simultan!
Capitolul < Lucrul cu date ,n MySQL %i SQL 101
MySQL ,n&elege nota&ia %tiin&i#ic! (ceasta este indicat prin inser&ia imediat dup un numr ,ntreg sau ,n virgul
mo$il a literei e sau +, unui caracter semn =C sau /> %i unui e.ponent ,ntreg! 1!28+C1< %i 82!<De/1 reprezint
numere scrise ,n nota&ie %tiin&i#ic corect! Pe de alt parte, 1!28+1< nu este scris corect, deoarece lipse%te
caracterul semn ,naintea e.ponentului! umerele ?e.azecimale nu pot #i #olosite ,n nota&iile %tiin&i#ice0 caracterul
e care se a#l la ,nceputul e.ponentului este, de asemenea, o ci#r ?e.azecimal corect %i ast#el se pot crea
con#uzii!
umerele pot #i precedate de un semn minus =/> pentru a semnala o valoare negativ!
7alori %ir =caracter>
Eirurile sunt valori ca 15ucure%ti, )om-nia1 sau 1pacientul se simte mai $ine1! Pentru a delimita o valoare %ir se
pot #olosi g?ilimele simple sau du$le!
,n interiorul %irurilor se pot #olosi numeroase secven&e escape, care se pot #olosi pentru a preciza caractere
speciale, a%a cum se poate vedea ,n ta$elul <!1! Fiecare secven& ,ncepe cu un caracter $acGslas? =H> pentru a
semni#ica o e.cep&ie temporar de la regulile o$i%nuite de interpretare a caracterelor! )e&ine&i c un octet UL nu
este unul %i acela%i lucru cu o valoare ULL0 UL este un octet de valoare zero, ,n timp ce ULL semni#ic
a$sen&a unei valori!
"a$elul <!1 Secven&e escape din %iruri
Secven& Semni#ica&ie
Ho UL =(SC** 0>
v I?ilimele simple
H1 I?ilimele du$le
H$ Etergere caracter anterior
Hn Caracter linie nou
Hr )etur de car
Ht Caracter de ta$ulare
HH 5acGslas?
Pentru a include g?ilimele ,ntr/un %ir, pute&i proceda ast#elJ
4u$la&i g?ilimelele, dac %irul este inclus ,ntre g?ilimele #olosind acela%i caracterJ
K(nii 1D01
1+l ziseJ 11"i/am spus eul111
,ncadra&i %irul #olosind celelalte g?ilimele0 ,n acest caz, nu du$la&i g?ilimelele din %irJ
1(nii KD01
K+l ziseJ 1"i/am spus eul1K
(nula&i semni#ica&ia g?ilimelelor cu un caracter $acGslas?0 aceast metod este aplica$il indi#erent de tipul
g?ilimelelor #olosite pentru a ,ncadra %irul0
K(nii HKD0K K(nii HKD01
10< Partea l Utilizarea general a sistemului MySQL
1+l ziseJ H1"i/am spus eulH11
K+l ziseJ H1"i/am spus euLH1K
,n conte.tele %irurilor, se pot #olosi constantele ?e.azecimale pentru a speci#ica valorile de tip %ir! Sinta.a este
cea descris anterior pentru valorile numerice, dar perec?ile de ci#re ?e.azecimale sunt interpretate drept coduri
(SC** si sunt convenite ,n caractere! )ezultatul este #olosit su$ #orm de %ir! 4e e.emplu, c-nd este interpretat
su$ #orm de %ir, 0.;1;<;2 este 1a$c1!
7alori de tip dat si or =temporale>
4atele si orele sunt valori precum 1 1::: / 0; /1D1 sau 1 1<J20J821! 4e asemenea, MySQL ,n&elege valorile
datMor com$inate, precum 11:::/0;/1D 1<J20J821! )e&ine&i #aptul c MySQL reprezint datele ,n ordinea an/
lun/zi! (cest lucru ,i surprinde deseori pe ,nceptorii ,n materie de MySQL, de%i acest #ormat este standardul
SQL (S*! Pute&i a#i%a valorile datelor ,n orice mod dori&i #olosind #unc&ia 4("+NF3)M("=>, dar #ormatul de
a#i%are presta$ilit a#i%eaz mai ,nt-i anul, iar valorile de intrare tre$uie speci#icate ,ncep-nd cu anul!
7aloarea ULL
ULL este un #el de valoare 6#r tip1, ,n general, este #olosit cu semni#ica&ia 6#r valoare1, 6valoare
necunoscut1, 6valoare lips1, 6,n a#ara domeniului1, 6nici una din precedentele op&iuni1 %i a%a mai departe!
Pute&i insera valori ULL ,n ta$ele, le pute&i regsi din ta$ele %i pute&i testa dac o valoare este sau nu ULL!
u pute&i e#ectua opera&ii aritmetice cu valori ULL! =4ac ,ncerca&i, rezultatul este ULL!>
"ipuri de coloane MySQL
Fiecare ta$el dintr/o $az de date este alctuit dintr/una sau mai multe coloane! C-nd crea&i un ta$el #olosind o
instruc&iune C)+("+ "(5L+, speci#ica&i un tip pentru #iecare coloan! Un tip de coloan este mai speci#ic dec-t
un tip de date, care este numai o categorie general de genul 6numr1 sau 6%ir1! Un tip de coloan caracterizeaz
cu e.actitate categoria de valori pe care o poate con&ine o coloan a unui ta$el dat, cum este SM(LL*" sau
7()C'()=2<>!
"ipurile de coloane MySQL reprezint miAloacele prin care descrie&i categoriile de valori pe care le con&in
coloanele unui ta$el, care, la r-ndul lor, determin modul ,n care MySQL trateaz aceste valori! 4e e.emplu,
dac ave&i valori numerice, le pute&i stoca #olosind un tip de coloan numeric sau %ir, dar MySQL va trata
valorile oarecum di#erit, ,n #unc&ie de modul ,n care le stoca&i! Fiecare tip de coloan are numeroase
caracteristiciJ
Ce tip de valori pute&i stoca ,n coloana respectiv
Spa&iul pe care ,l ocup valorile, precum %i dac valorile sunt de lungime #i. =toate valorile de acel tip ocup
aceea%i cantitate de spa&iu> sau de lungime varia$il =cantitatea de spa&iu depinde de valoarea particular stocat>
Modul de comparare si stocare a valorilor din tipul respectiv
Capitolul < Lucrul cu date ,n MySQL %i SQL 102
4ac tipul respectiv accept sau nu valori ULL
4ac tipul respectiv poate #i inde.at sau nu
7om e.amina succint tipurile de coloan MySQL pentru a avea o imagine de ansam$lu, dup care vom discuta
mai detaliat propriet&ile care caracterizeaz #iecare tip!
3 e.aminare a tipurilor de coloane
MySQL #urnizeaz tipuri de coloane pentru valori din toate categoriile generale de tipuri de date, cu e.cep&ia
valorii ULL! 7aloarea ULL acoper toate tipurile, ,n sensul c posi$ilitatea unei coloane de a con&ine sau nu
valori ULL este tratat ca atri$ut de tip! MySQL are tipuri de coloane at-t pentru valorile ,ntregi, c-t %i pentru
cele cu virgul mo$il, a%a cum se poate vedea ,n ta$elul <!<! Coloanele ,ntregi pot #i cu sau #r semn! Un
atri$ut special permite valorilor din coloanele ,ntregi s #ie generate automat, ceea ce este util ,n aplica&ii care
impun numere dintr/o secven& sau de identi#icare unice!
"a$elul <!< "ipuri de coloane numerice
umele tipului
"*O*"
SM(LL*"
M+4*UM*"
*"
5*I*"
FL3("
43U5L+
4+C*M(L
Semni#ica&ie
Un ,ntreg #oarte mic
Un ,ntreg mic
Un ,ntreg de dimensiune medie
Un ,ntreg standard
Un ,ntreg mare
Un numr cu virgul mo$il ,n precizie simpl
Un numr cu virgul mo$il ,n du$l precizie
Un numr cu virgul mo$il, reprezentat su$ #orm de %ir
"ipurile de coloane %ir din MySQL sunt prezentate ,n ta$elul <!2! Eirurile pot con&ine orice, c?iar si date $inare
ar$itrare, cum sunt imaginile sau sunetele! Eirurile pot #i comparate ,n #unc&ie de sensi$ilitatea lor la di#eren&a
,ntre maAuscule %i minuscule! 4e asemenea, pute&i e#ectua cu %iruri sta$ilirea de coresponden&e cu un model! =4e
#apt, ,n MySQL pute&i e#ectua sta$ilirea de coresponden&e cu un model pentru orice tip de coloane, dar aceast
opera&ie se e.ecut cel mai #recvent cu tipuri %ir!>
"a$elul <!2 "ipuri de coloane %ir NNNNNNNNNNNNNNNNN
umele tipului
C'()
7()C'()
"*O5L35
5L35
M+4*UM5L35
Semni#ica&ie
Un %ir de caractere de lungime #i. Un %ir de caractere de lungime varia$il Un 5L35 =o$iect $inar mare> #oarte
mic Un 5L35 mic Un 5L35 de dimensiuni medii
Continuare
108 Partea l Utilizarea general a sistemului MySQL "a$elul <!2 Continuare
umele tipului
L3I5L35
"*O"+B"
"+B"
M+4*UM"+B"
L3I"+B"
+UM
S+"
Semni#ica&ie
Un 5L35 de dimensiuni mari
Un %ir te.t #oarte mic
Un %ir te.t mic
Un %ir te.t de dimensiuni medii
Un %ir te.t de mari dimensiuni
3 enumerare0 coloanelor li se poate atri$ui un mem$ru al enumerrii
Un set0 coloanelor li se pot atri$ui mai mul&i mem$ri ai unui set
"ipurile date %i or din MySQL sunt prezentate ,n ta$elul <!8! Pentru valori temporale, MySQL #urnizeaz tipuri
pentru date =cu sau #r or>, ore %i amprente de timp =un tip special, care v permite s detecta&i data %i ora
e#ecturii ultimei modi#icri ,ntr/o ,nregistrare>! 4e asemenea, e.ist un tip pentru reprezentarea e#icient a
valorilor anilor, atunci c-nd nu ave&i nevoie de o dat complet!
"a$elul <!8 "ipuri de coloane dat %i or
umele tipului Semni#ica&ie
4("+ 3 valoare pentru dat, ,n #ormat 1((((/LL /<<K
"*M+ 3 valoare pentru or, ,n #ormat K??JmmJssK
4("+"*M+ 3 valoare pentru dat si or, ,n #ormat K((((/LL /PP ?? JmmJssK
"*M+S"(MP 3 valoare pentru amprenta de timp, ,n #ormat ((((LLPP??mmss
O+() 3 valoare pentru an, ,n #ormat ((((
Pentru a crea un ta$el, emite&i o instruc&iune C)+("+ "(5L+ %i speci#ica&i o list a coloanelor care alctuiesc
ta$elul! Fiecare coloan are un nume %i un tip, iar la #iecare tip se pot asocia mai multe atri$ute! *at un e.emplu
care creeaz un ta$el denumit ta$elulAneu, cu trei coloane, denumite #, c %i iJ C)+("+ "(5L+ ta$elulAneu
# FL3("=10,8>,
C C'()=1@> 3" ULL 4+F(UL" 1nimic1,
i "*O*" US*I+4 ULL
Sinta.a pentru declararea unei coloane este urmtoareaJ
numeNcol tipNcol Qatri$uteNcoloanaR Qatri$uteNgeneraleR umele coloanei este dat de numeNcol! umele
coloanelor pot avea o lungime de ma.i/ 1S mum ;8 de caractere %i pot #i alctuite din caractere al#anumerice,
precum si din carac/1 terul de su$liniere %i sim$olul dolarului =,n spe& N %i T>! Un nume de coloan poate S
,ncepe cu orice caracter admis ,ntr/un nume, inclusiv cu o ci#r! "otu%i, urt nume #ltrAl poate #i compus integral
din ci#re, deoarece ast#el ar deveni practic con#unda$il cu unii
Capitolul < Lucrul cu date ,n MySQL %i SQL 10@
numr! Cuvinte precum S+L+C", 4+L+"+ sau C)+("+ sunt rezervate %i nu pot #i #olosite drept nume de
coloan! "otu%i, numele #unc&iilor =cuvinte precum P3S %i M* > nu sunt rezervate si pot #i #olosite!
"ipul de coloan tipNcol precizeaz categoria e.act de valori pe care le poate con&ine coloana! Speci#icatorul de
tip mai poate indica %i lungimea ma.im a valorilor pe care le stoca&i ,n coloan! Pentru unele tipuri, speci#ica&i
lungimea ,n mod e.plicit su$ #orm numeric! Pentru altele, lungimea se deduce din numele tipului! 4e
e.emplu, C'() =10> speci#ic o lungime e.plicit de 10 caractere, ,n timp ce valorile "*O5L35 au o lungime
ma.im implicit de <@@ caractere! Unii dintre speci#icatorii de tip v permit s indica&i o l&ime ma.im a#i%at
=numrul de caractere de utilizat pentru a#i%area valorilor>! "ipurile de coloane cu virgul mo$il permit
speci#icarea numrului de ci#re dup virgul, ast#el ,nc-t s pute&i controla nivelul de precizie al valorilor!
4up tipul coloanei, pute&i speci#ica atri$ute op&ionale speci#ice unui anumit tip, precum si atri$ute de ordin mai
general! (tri$utele #unc&ioneaz ca modi#icatori de tip! (cestea determin programul MySQL s modi#ice ,ntr/un
#el sau altul tratamentul aplicat valorilor din coloanJ
(tri$utele permise speci#ice tipului depind de tipul de coloan pe care ,l alege&i! 4e e.emplu, US*I+4 este
permis numai pentru tipurile ,ntregi, iar 5*()O este permis numai pentru tipurile C'() si 7()C'()!
(tri$utele generale pot #i date pentru orice tip de coloan, cu anumite e.cep&ii! Pute&i speci#ica ULL sau 3"
ULL pentru a preciza dac o coloan poate con&ine sau nu valori ULL! 4e asemenea, pute&i speci#ica
4+F(UL" valoareNpresta$ilita pentru a arta c o coloan tre$uie s primeasc valoarea valoareNpresta$ilita
atunci c-nd este creat un r-nd nou #r a se speci#ica ,n mod e.plicit valoarea coloanei! 7aloarea
valoareNpresta$ilita tre$uie s #ie o constant0 nu poate #i o e.presie %i nici nu poate #ace re#erire la alte coloane!
u pute&i speci#ica o valoare presta$ilit pentru coloanele 5L35 sau "+B"!
4ac sunt precizate mai multe atri$ute speci#ice unei anumite coloane, acestea pot #i precizate ,n orice ordine, cu
condi&ia ca acestea s respecte tipul coloanei %i s precead toate atri$utele generale! Similar, dac sunt date mai
multe atri$ute generale, ele pot #i speci#icate ,n orice ordine, cu condi&ia s respecte tipul coloanei %i s #ie
plasate dup toate atri$utele speci#ice de coloan e.istente!
,n continuare, aceast sec&iune discut despre #iecare dintre tipurile de coloan MySQL, pentru a prezenta sinta.a
utilizat la declararea tipului %i propriet&ile care o caracterizeaz, cum ar #i cerin&ele privind domeniul %i
capacitatea de stocare! Speci#ica&iile de tip sunt prezentate a%a cum sunt utilizate acestea ,n instruc&iunile
C)+("+ "(5L+! *n#orma&iile op&ionale sunt ,ncadrate ,ntre paranteze drepte =Q R>! 4e e.emplu, sinta.a
M+4*UM*"Q =M> R arat c l&imea ma.im de a#i%are, speci#icat su$ #orma =M>, este op&ional! Pe de alt
parte, pentru C'() =M>, lipsa parantezelor arat c =M> este o$ligatorie!
10; Partea l Utilizarea general a sistemului MySQL
"ipuri de coloane numerice
"ipurile de coloane numerice din MySQL se ,ncadreaz ,n dou categorii generaleJ
"ipuri ,ntregi! Pentru numerele #r parte #rac&ionar, precum 1, 82, /2,0 sau /D:;82<! Pute&i #olosi coloanele
,ntregi pentru date reprezentate de numere ,ntregi, precum greutatea apro.imat la cea mai apropiat cantitate ,n
Gilograme, ,nl&imea apro.imat la valoarea ,n centimetri cea mai apropiat, numrul de stele dintr/o gala.ie,
numrul de persoane dintr/o gospodrie sau numrul de $acterii dintr/un vas de cultur!
"ipuri cu virgul mo$il! Pentru numere care pot avea o parte #rac&ionar, precum 2!181@:, /! 00<D2, /8!D9 sau
2:! 2+C8! Pute&i #olosi tipuri de coloane cu virgul mo$il pentru valori care pot avea o parte #rac&ionar sau care
sunt e.trem de mari sau de mici! Printre tipurile de date care pot #i reprezentate su$ #orm de valori cu virgul
mo$il suntJ produc&ia agricol medie, distan&ele, valorile monetare =pre&ul unui articol sau un salariu>, rata
%omaAului sau pre&urile ac&iunilor la $urs! (cestea sunt tratate su$ #orm de valori cu virgul mo$il cu o parte
#rac&ionar zero!
umele %i domeniul #iecrui tip numeric sunt prezentate ,n ta$elul <!@! Cantitatea de spa&iu necesar pentru
valorile de #iecare tip este prezentat ,n ta$elul <!;!
*nstruc&iunea C)+("+ "(5L+
+.emplele #olosite ,n acest capitol utilizeaz in e.tenso instruc&iunea C)+("+ "(5L+! *nstruc&iunea ar tre$ui
s v #ie destul de cunoscut, deoarece am #olosit/o ,n sec&iunea de manual a capitolului 1, 6*ntroducere ,n
MySQL %i SQL1! 4e asemenea, vezi in#orma&iile despre instruc&iunea C)+("+ "(5L+ din (ne.a 4, 6)e#erin&
de sinta. SQL1!
"a$elul <!@ 4omenii de e.isten& ale tipurilor de coloane numerice Speci#ica&ie de tip
"*O*"Q=U>R
SM(LL*"Q=M>R M+4*UM*"Q=M>R *"Q=M>R 5*I*"Q=M>R
FL3("Q=U,0>R, FL3("=8> 43U5L+Q=M,4>R, FL3("=9> 4+C*M(L=M,4>
4omeniu
7alori cu semnJ ,ntre /1<9 %i 1<D =,ntre /<D %i <D/1> 7alori #r semn ,ntre 3 %i <@@ =,ntre 3 %i <9/1>
7alori cu semnJ ,ntre/2<D;9 %i 2<D;D =,ntre/<1@ %i <1@/1> 7alori #r semnJ ,ntre 3 %i ;@@2@ =,ntre 3 %i <1;/1>
7alori cu semnJ ,ntre /9299;09 %i 9299;0D =,ntre /<<2 %i <<2/1> 7alori #r semnJ ,ntre 3 %i 1;DDD<1@ =,ntre 3 %i
<<8/1>
7alori cu semnJ ,ntre / <18D892;89 %i <18D892;8D =,ntre /<21 %i <21/1V 7alori #r semnJ ,ntre 3 %i 8<:8:;D<:@
=,ntre 3 %i <2</1>
7alori cu semnJ ,ntre /:<<22D<02;9@8DD@909 %i
:<<22D<02;9@8DD@90D =,ntre/<;2 %i <W/1>,
7alori #r semnJ ,ntre 3 %i 1988;D880D2D0:@@1;1@ =,ntre 3 %i ;8/L>
7alori minime di#erite de zeroJ X1!1D@8:82@1+/29 7alori ma.ime di#erite de zeroJ X2!80<9<28;;+C29
7alori minime di#erite de zeroJ X<!<<@0D29@9@0D<018+/209 7alori ma.ime di#erite de zeroJ
X1!D:D;:21289;<21@D+C209
7ariaz0 domeniul depinde de u %i 4!
Capitolul < Lucrul cu date ,n MySQL %i SQL 10D "a$elul <!; ecesit&i de spa&iu de stocare pentru tipurile
de coloane numerice
Speci#ica&ie de tip
"*O*"Q=M>R
SM(LL*"Q=M>R
M+4*UM*"Q=M>R
*"Q=M>R
5*I*"Q=M>R
FL3("Q=M,0>R, FL3("=8>
43U5L+Q=M,4>R, FL3("=9>
4+C*M(L=Y,4>
Spa&iu necesar
1 octet
< octe&i
2 octe&i
8 octe&i 9 octe&i 8 octe&i 9 octe&i
M octe&i =versiune MySQL anterioar versiunii 2!<2>, MC< octe&i =versiune MySQL ulterioar versiunii 2!<2 sau
c?iar versiunea 2!<2>
MySQL #urnizeaz cinci tipuri ,ntregiJ "*O*", SM(LL*", M+4*UM*", *" %i 5*I*Z! *"+I+) este
un sinonim pentru *"! (ceste tipuri variaz din punctul de vedere al domeniului de valori pe care ,l pot
reprezenta! Coloanele ,ntregi pot #i declarate ca US*I+4 pentru a interzice valorile negative0 ast#el,
domeniul pentru coloan este deplasat ,n sus pe a.a numerelor, ,ncep-nd ast#el de la 0! 4e asemenea, tipurile
variaz din punct de vedere al cantit&ii de spa&iu necesare! "ipurile cu un domeniu mai e.tins necesit un spa&iu
de stocare mai mare!
MySQL #urnizeaz trei tipuri cu virgul mo$ilJ FL3(", 43U5L+ %i 4+C*M(L! Spre deose$ire de tipurile
,ntregi, tipurile cu virgul mo$il nu pot #i US*I+4, iar domeniul lor este di#erit de acela al tipurilor ,ntregi,
prin aceea c tipul respectiv nu poate reprezenta numai o valoare ma.im, ci %i o valoare minim di#erit de zero!
7alorile minime #urnizeaz o msur a preciziei tipului, ceea ce este deseori important pentru ,nregistrarea
datelor %tiin&i#ice! =+.ist, desigur, valori ma.ime %i minime negative corespunztoare!>
43U5L+ P)+C*S*3L =M,3>R %i )+(LQ=M,4>R sunt sinonime pentru 43U5L+Q =M,4> R! UM+)*C=Y,4>este
sinonim cu 4+C*M(L=M,4>! FL3("=8> %i FL3("=9> sunt #urnizate pentru compati$ilitatea cu 345C! ,nainte
de MySQL 2!<2, acestea erau sinonime cu FL3("=10,<>, respectiv 43U5L+ =1;,8>! ,ncep-nd de la MySQL
2!<2, FL3(" =8> %i FL3(" =9> ,%i au propriul comportament, descris pe scurt ,n continuare!
C-nd alege&i un tip numeric, v g-ndi&i la domeniul de valori pe care tre$uie s/1 reprezenta&i %i alege&i cel mai
mic tip care va acoperi domeniul! Prin alegerea unui tip mai mare se pierde spa&iu, rezult-nd ast#el ta$ele inutil
de mari, care nu pot #i prelucrate la #el de e#icient ca si atunci c-nd a&i #i ales un tip mai mic! Pentru valori
,ntregi, "*O*" este optim dac domeniul de valori al datelor dumneavoastr este redus, cum ar #i v-rsta unei
persoane sau numrul de #ra&i sau surori! M+4*UM*" poate reprezenta milioane de valori si poate #i #olosit
pentru mult mai multe tipuri de valori, cu pre&ul unui spa&iu de stocare ceva mai mare! 5*I*Z are cel mai mare
domeniu dintre toate tipurile, dar necesit un spa&iu de stocare du$lu #a& de cel mai mic tip ,ntreg urmtor =l">
%i tre$uie s #ie #olosit numai atunci c-nd este ,ntr/adevr nevoie! Pentru valori cu virgul mo$il, 43U5L+
ocup de dou ori mai mult spa&iu dec-t FL3("! Cu e.cep&ia situa&iilor c-nd ave&i nevoie de o precizie
e.cep&ional sau de un domeniu de valori e.trem de mare, pro$a$il c v pute&i reprezenta datele la numai
Aumtate din spa&iul de stocare, #olosind FL3("!
109 Partea l Utilizarea general a sistemului MySQL
C-nd declara&i o coloan de tip ,ntreg, pute&i speci#ica o dimensiune op&ional de a#i%are M! 4ac este dat, M
tre$uie s #ie un ,ntreg cuprins ,ntre 1 %i <@@ %i reprezint numrul de caractere #olosit pentru a a#i%a valorile din
coloan! 4e e.emplu, M+4*UM*"=8> speci#ic o coloan M+4*UM*" cu o l&ime de a#i%are egal cu 8!
4ac declara&i o coloan de tip ,ntreg #r o l&ime e.plicit, este atri$uit o l&ime presta$ilit! 7alorile
presta$ilite constituie lungimile valorilor 6celor mai lungi1 pentru #iecare tip! 4ac reprezentarea care se poate
a#i%a a unei anumite valori necesit mai mult de M caractere, atunci se va a#i%a valoarea total0 valorile nu vor #i
6amputate1 pentru a se ,ncadra ,n limita celor M caractere!
Pentru #iecare tip de coloan cu virgul mo$il, pute&i speci#ica o dimensiune ma.im de a#i%are M %i numrul de
ci#re dup virgul 4! 7aloarea lui M tre$uie s #ie cuprins ,ntre l si <@@! 7aloarea lui 4 poate #i cuprins ,ntre 3
%i 20, dar nu tre$uie s dep%easc M/<! =4ac sunte&i un cunosctor al terminologiei 345C, M %i 4 corespund
conceptelor 345C de 6precizie1 %i 6scar1!> M %i 4 sunt op&ionale pentru FL3(" %i 43U5L+, dar sunt
o$ligatorii pentru 4+C*M(L!
(colo unde M %i 4 sunt op&ionale, ,n caz de omisiune sunt #olosite valori presta$ilite! Urmtoarea instruc&iune
creeaz un ta$el pentru a ilustra valorile presta$ilite ale op&iunilor M %i 4 pentru tipurile de coloane numerice
=4+C*M(L nu este inclus, deoarece M %i 4 nu sunt op&ionale pentru tipul respectiv>J C)+("+ "(5L+
ta$elulAneu
itiny "*O*", itinyNu "*O*" US*I+4, ismall SM(LL*", ismallNu SM(LL*" US*I+4,
imedium M+4*UM*", imediumNu M+4*UM*" US*I+4, ireg *", iregNu *" US*I+4, i$ig
5*I*", i$igNu 5*I*" US*I+4, #pNsingle FL3(", #pNdou$le 43U5L+
4ac emite&i o instruc&iune 4+SC)*5+ ta$elulNmeu dup crearea ta$elului, coloanele Field si "ype ale
datelor de ie%ire se vor prezenta ast#el<J
Field "ype
itiny tinyint=8>
itinyNu tinyint=2> unsigned
ismall smallint=;>
ismallNu smallint=S> unsigned
imedium mediumint=:>
imediumAA mediumint=9> unsigned
ireg int=11>
ireg u int=*3> unsigned
i$ig $igint=<0>
i$igNu $igint=<0> unsigned
#pNsingle #loat=10,<>
#pNdou$le #loat=1;,8>
< L&imea de a#i%are pentru 5*I*" va #i <1 =nu <0> dac rula&i aceast interogare #olosind o versiuni A MySQL
anterioar versiunii 2!<2, datorit unei erori minore! / !(!
Capitolul < Lucrul cu date ,n MySQL %i SQL 10:
Fiecare coloan numeric are un domeniu de valori determinat de tipul coloanei! 4ac ,ncerca&i s insera&i o
valoare care se a#l ,n a#ara domeniului coloanei, se produce o trunc?iereJ MySQL 6taie1 valoarea corespunztor
punctului #inal adecvat al domeniului %i #olose%te rezultatul! La regsirea valorilor nu se produce nici o
trunc?iere!
"runc?ierea valorilor se produce ,n con#ormitate cu domeniul tipului coloanei, nu cu l&imea de a#i%are! 4e
e.emplu, o coloan SM(LL*"=2> are o l&ime de a#i%are egal cu 2 %i un domeniu cuprins ,ntre /2<D;9 si
2<D;D! 7aloarea 1<28@ este mai 6lat1 dec-t l&imea de a#i%are, dar se a#l ,n interiorul domeniului coloanei, deci
este inserat #r 6tiere1 si regsit su$ #orma 1<28@! 7aloarea ::::: se a#l ,n a#ara domeniului, deci este
redus la 2<D;D c-nd este inserat! La regsirile ulterioare, valoarea apare su$ #orma 2<D;D!
,n general, valorile atri$uite unei coloane cu virgul mo$il sunt rotunAite la numrul de zecimale indicat la
speci#icarea coloanei! 4ac stoca&i valoarea 1!<28@;2 ,ntr/o coloan FL3(" =9,1>, rezultatul este 1!<! 4ac
stoca&i aceea%i valoare ,ntr/o coloan FL3(" =9,8>, rezultatul este 1!<28;! (ceasta ,nseamn c tre$uie s
declara&i coloanele cu virgul mo$il cu un numr de zecimale su#icient de mare pentru a v o#eri valori la
precizia dorit! 4ac ave&i nevoie de o precizie de ordinul miimilor, nu declara&i un tip cu numai dou ci#re dup
virgul!
+.cep&ia de la acest mod de manipulare a valorilor cu virgul mo$il const ,n aceea c, ,n MySQL 2!<2,
comportarea tipurilor FL3("=8> si FL3("=9> s/a modi#icat! (ceste dou tipuri sunt acum de tip precizie simpl
=8 octe&i>, respectiv du$l =9 octe&i>, care sunt tipuri cu virgul mo$il autentice, ,n sensul c valorile sunt stocate
a%a cum sunt date, ,n cadrul limitelor impuse de componentele dumneavoastr ?ard[are!
"ipul 4+C*M(L este di#erit de FL3(" %i 43U5L+, ,n sensul c valorile 4+C*M(L sunt, de #apt, stocate su$
#orm de %iruri! 4omeniul ma.im posi$il pentru 4+C*M(L este acela%i ca pentru 43U5L+, dar domeniul
e#ectiv este determinat de valorile parametrilor M %i 4! 4ac M variaz %i 4 rm-ne #i., domeniul cre%te dac M
cre%te! (cest #apt este ilustrat de primele trei r-nduri ale ta$elului <!D! 4ac M rm-ne #i. %i 4 variaz, domeniul
devine mai mic dac 4 creste, de%i precizia creste! (cest #apt este ilustrat de ultimele trei r-nduri ale ta$elului
<!D!
"a$elul <!D *n#luen&a valorilor parametrilor M si 4 asupra domeniului tipului 4+C*M(L =M,4>
Speci#ica&ie de tip
4+C*M(L=8,1> 4+C*M(L=@,1> 4+C*M(L=;,1> 4+C*M(L=;,<> 4+C*M(L=;,2>
4omeniu =pentru MySQL \ 2!<2>
,ntre /:,: %i ::,: ,ntre /::,: %i :::,: ,ntre /:::,: %i ::::,: ,ntre /::,:: %i :::,:: ,ntre /:,::: %i ::,:::
4omeniu =pentru MySQL 2!<2>
,ntre /:::,: %i ::::,: ,ntre /::::,: %i :::::,: ,ntre /:::::,: %i ::::::,: ,ntre /::::,:: %i :::::,:: ,ntre
/:::,::: %i ::::,:::
4omeniul unui tip 4+C*M(L dat depinde de versiunea dumneavoastr de MySQL! Pentru versiunile MySQL
anterioare versiunii 2!<2, coloanele de tip 4+C*M(L =M, 4> sunt stocate #olosind M octe&i per valoare, iar
caracterul semn =dac este necesar> %i virgula sunt incluse ,n cei M octe&i! (st#el, pentru un tip 4+C*M(L=@,<>,
domeniul este cuprins ,ntre /:,:: si ::,::, deoarece ,n acest interval se ,ncadreaz toate valorile de @ caractere
posi$ile!
# 8! "WP/] K
*/ , S5W' ,
/iSP
K ,n lim$a englez, virgula zecimal se reprezint ca punct zecimal! MySQL #olose%te acest sistem! / !"
110 Partea l Utilizarea general a sistemului MySQL
,ncep-nd de la MySQL 2!<2, valorile 4+C*M(L sunt manipulate ,n con#ormitate cu speci#ica&ia (S*, care
precizeaz c un tip 4+C* M(L =M, 4> tre$uie s poat reprezenta toate valorile cu M ci#re %i 4 ci#re dup
virgul! 4e e.emplu, 4+C*M(L=@,<> tre$uie s poat reprezenta valori cuprinse ,ntre /:::,:: %i :::,::!
Caracterul semn si virgula tre$uie si ele stocate, deci valorile 4+C*M(L ,ncep-nd de la versiunea MySQL 2!<2
#olosesc MC< octe&i! Pentru 4+C*M(L=@,<> sunt necesari D octe&i pentru 6cea mai lung1 valoare =/:::,::>! La
e.tremitatea pozitiv a domeniului, octetul de semn nu este necesar pentru memorarea unui caracter semn, deci
MySQL ,l #olose%te pentru a e.tinde domeniul dincolo de cel cerut prin speci#ica&ia (S*! Pentru
4+C*M(L=@,<>, valoarea ma.im poate #i ::::,::, deoarece sunt disponi$ili D octe&i!
Pe scurt, domeniul tipului 4+C*M(L=M,4> pentru versiunile de la MySQL 2!<2 6,n sus1 este ec?ivalent cu
domeniul tipului 4+C*M(L=MC<,4> din versiunile anterioare!
,n toate versiunile de MySQL, dac 4 este egal cu 3 pentru o coloan 4+C*M(L, virgula nu este stocat!
+#ectul este o e.tindere a domeniului coloanei cu un ordin de mrime suplimentar, deoarece octetul #olosit ,n
mod normal pentru stocarea virgulei se poate utiliza pentru o alt ci#r!
(tri$utele tipului de coloan numeric
(tri$utul P+)3F*LL poate #i speci#icat pentru toate tipurile numerice! (cesta determin completarea cu zerouri
ini&iale a valorilor a#i%ate pentru coloan, pentru a se o$&ine l&imea de a#i%are! Pute&i #olosi P+)3F*LL c-nd
dori&i s v asigura&i c valorile din coloane sunt ,ntotdeauna a#i%ate #olosind un numr de ci#re dat! 4e #apt, este
mai $ine s spunem 6un numr minim dat de ci#re1, deoarece valorile cu un numr de ci#re mai mare dec-t
l&imea de a#i%are sunt a#i%ate complet, #r a #i 6tiate1! Pute&i vedea acest lucru emi&-nd urmtoarele
instruc&iuniJ
C)+("+ "(5L+ ta$elulAneu =completareNzerouri *"=@> P+)3F*LL> *S+)" *"3 ta$elulAneu
7(LU+S=1>,=100>,=10000>,=1000000> S+L+C" completareNzerouri F)3M ta$elulAneu
4atele de ie%ire ale instruc&iunii S+L+C" sunt prezentate ,n continuare! 3$serva&i c valoarea #inal, care are un
numr de ci#re mai mare dec-t l&imea de a#i%are a coloanei, este a#i%at completJ
completareNzerouri
00001
00100
10000
1000000
(lte dou atri$ute pot #i speci#icate numai pentru tipurile de coloane ,ntregiJ
(U"3N*C)+M+"! Folosi&i atri$utul (U"3N*C)+M+" c-nd dori&i s genera&i identi#i/,0 catori unici
sau valori ,n serie, ,n mod normal, valorile (U"3N*C)+M+" ,ncep de la 7 %i cresc cu o unitate pentru
#iecare r-nd! C-nd insera&i ULL ,ntr/o coloana0A (U"3N*C)+M+", MySQL insereaz o valoare cu o
unitate mai mare dec-t valoare^^ ma.im curent din acea coloan, ,ntr/un ta$el pute&i avea ma.imum o coloanA
(U"3 *C)+M+"!
Capitolul < Lucrul cu date ,n MySQL %i SQL 111
Pentru orice coloan unde dori&i s #olosi&i (U"3N*C)+M+", coloana tre$uie s #ie declarat 3" ULL
%i, de asemenea, ca P)*M()O ]+O sau drept c?eie U*QU+! 4e e.emplu, pute&i declara o asemenea coloan
,n oricare din urmtoarele moduriJ C)+("+ "(5L+ ai =i *" (U"3N*C)+M+" 3" ULL P)*M()O
]+O> C)+("+ "(5L+ ai =i *" (U"3N*C)+M+" 3" ULL, P)*M()O ]+O =i>> C)+("+
"(5L+ ai =i *" (U"3N*C)+M+" 3" ULL, U*QU+=i>> Comportarea atri$utului
(U"3N*C)+M+" este discutat mai apro#undat ,n paragra#ul 6Lucrul cu secven&e1!
US*I+4! (cest atri$ut interzice valorile negative! 4ac o coloan prime%te atri$utul US*I+4,
dimensiunea domeniului tipului de date de $az nu se modi#ic, ci pur %i simplu este deplasat ,nainte =spre
dreapta> pe a.a numerelor! I-ndi&i/v la aceast speci#ica&ie de ta$elJ !
C)+("+ "(5L+ ta$elulAneu
=
itiny "*O*",
itinyNu "*O*" US*I+4
>
itiny si itinyAA sunt am$ele coloane de tip "*O*", cu un domeniu de <@; de valori, dar domeniul lui itiny este
cuprins ,ntre /1<9 si 1<D, ,n timp ce domeniul lui itinyNu este cuprins ,ntre 3 %i <@@!
US*I+4 este util pentru coloane ,n care inten&iona&i s stoca&i date care nu iau valori negative, cum sunt
valorile popula&iilor sau ci#rele privind prezen&a la un curs! 4ac #olosi&i o coloan o$i%nuit, cu semn, pentru
asemenea valori, #olosi&i numai Aumtate din domeniul tipului de coloan! C-nd coloana prime%te atri$utul
US*I+4, e#ectiv ,%i du$leaz domeniul! 4ac #olosi&i coloana pentru numere ,n secven&, ve&i avea nevoie de
un numr du$lu de valori pentru a epuiza domeniul dac declara&i coloana cu atri$utul US*I+4!
4up atri$utele pe care tocmai le/am descris, care sunt caracteristice coloanelor numerice, mai pute&i speci#ica si
atri$utele generale ULL %i 3" ULL! 4ac nu speci#ica&i ULL sau 3" ULL, valoarea presta$ilit este
ULL! 4e asemenea, pute&i speci#ica o valoare presta$ilit #olosind atri$utul 4+F(UL"! 4ac nu speci#ica&i o
valoare presta$ilit, aceasta va #i aleas automat! Pentru toate tipurile de coloane numerice, valoarea presta$ilit
este ULL pentru coloanele care pot con&ine ULL, respectiv 3 pentru celelalte!
+.emplul urmtor creeaz un ta$el cu trei coloane * ", cu valorile presta$ilite /l, l %i ULLJ
C)+("+ "(5L+ t
=
11 *" 4+F(UL" /1,
1< *" 4+F(UL" 1,
12 *" 4+F(UL" ULL
K C 1
Yt1_! !
7``,!
11< Partea l Utilizarea general a sistemului MySQL
Lucrul cu secven&e
Multe aplica&ii tre$uie s #oloseasc numere unice pentru motive legate de identi#icare! ecesitatea unicit&ii
valorilor survine ,ntr/un numr de conte.teJ numere de mem$ri, numerotarea mostrelor sau a loturilor,
identi#icatori de clien&i, etic?ete ale rapoartelor privind ?i$ele sau ale tic?etelor de semnalare a pro$lemelor %i
altele!
Mecanismul sistemului MySQL pentru #urnizarea de numere unice #olose%te coloanele (U"3N*C)+M+"!
(cestea v permit s genera&i automat numere ,n secven&! 4in pcate, (U"3N*C)+M+" este o #acilitate
uneori prost ,n&eleas, #enomen determinat poate de modi#icrile aduse acestei caracteristici ,n MySQL 2!<2!
(ceast sec&iune descrie modul de comportare a coloanelor (U"3N*C)+M+" ast#el ,nc-t dumneavoastr s
le pute&i #olosi ,n mod e#icient, #r a cdea ,n capcanele care deseori iau oamenii prin surprindere! 4e asemenea,
sec&iunea v prezint modul de generare a secven&elor #r utilizarea unei coloane (U"3N*C)+M+"!
(U"3N*C)+M+" pentru versiunile MySQL anterioare versiunii 2<2
Pentru versiunile sistemului MySQL anterioare versiunii 2!<2, coloanele (U"3N*C)+/M+" se comport
dup cum urmeazJ
*nser&ia unei valori ULL ,ntr/o coloan (U"3N*C)+M+" determin MySQL s genereze automat
urmtorul numr din secven& %i s insereze ,n sc?im$ acea valoare ,n coloan! Secven&ele
(U"3N*C)+M+" ,ncep cu l, deci prima ,nregistrare inserat ,n ta$el prime%te ,n coloan o valoare
secven&ial egal cu l, iar ,nregistrrile ulterioare primesc valori egale cu <, 2 etc! ,n general, #iecare valoare
generat automat va #i cu o unitate mai mare dec-t valoarea ma.im curent stocat ,n coloan!
*nser&ia unui 3 ,ntr/o coloan (U"3N*C)+M+" este similar cu inser&ia valorii ULL ,n coloan! *nser&ia
unui r-nd #r speci#icarea unei valori pentru coloana (U"3N*C)+M+" este de asemenea similar cu
inser&ia unei valori ULL!
4ac insera&i o ,nregistrare si speci#ica&i ,n mod e.plicit o valoare pentru coloana (U"3N*C)+M+", se va
,nt-mpla unul din urmtoarele dou lucruri! 4ac e.ist deAa o ,nregistrare cu valoarea respectiv, se va produce
o eroare, deoarece valorile din coloanele (U"3N*C)+M+" tre$uie s #ie unice! 4ac nu e.ist o ,nregistrare
cu acea valoare, ,nregistrarea este inserat %i, dac valoarea din coloan este noua valoare ma.im, secven&a
continu cu valoarea urmtoare aceleia pentru r-ndurile ulterioare! Cu alte cuvinte, pute&i 6#or&a1 contorul prin
inser&ia unei ,nregistrri cu o valoare din secven& mai mare dec-t valoarea curent a contorului!
For&area contorului poate determina goluri ,n secven&, dar pute&i e.ploata aceast comportare ,n avantaAul
dumneavoastr! S presupunem c a&i creat un ta$el cu o coloan (U"3N*C)+M+", dar dori&i ca o secven&
s ,nceap cu 1000, nu cu 1! Pute&i realiza acest lucru ,n dou moduri! Mai ,nt-i, pute&i insera prima ,nregistrare
cu o valoare de secven& e.plicit egal cu 1000, dup care insera&i ,nregistrrile ulterioare prin intro/ ^ ducerea
valorii ULL ,n coloana (U"3N*C)+M+"! ,n al doilea r-nd, pute&i insera o #als K\^ ,nregistrare ,n coloana
(U"3N*C)+M+", cu valoarea :::! Prima ,nregistrare real pe a, care o insera&i dup aceea va primi un
numr de secven& egal cu 1000, dup care pute&i %terge ,nregistrarea #als!
syY
Capitolul < Lucrul cu date ,n MySQL %i SQL 112
4ac insera&i o valoare incorect ,ntr/o coloan (U"3N*C)+M+", nu v a%tepta&i s se ,nt-mple ceva util!
)ezultatul nu poate #i anticipat!
4ac %terge&i ,nregistrarea care con&ine cea mai mare valoare dintr/o coloan (U"3N*C)+/M+", valoarea
respectiv va #i reutilizat la urmtoarea generare a unei valori noi! 4ac %terge&i toate ,nregistrrile din ta$el,
vor #i re#olosite toate valorile %i secven&a este reluat, pornind de la 1!
*nstruc&iunile )+PL(C+ #unc&ioneaz normal!
*nstruc&iunile UP4("+ #unc&ioneaz #olosind reguli similare celor care se aplic inser&iei de noi ,nregistrri!
4ac actualiza&i o coloan (U"3N*C)+M+" cu valoarea ULL sau 3, aceasta este actualizat la urmtorul
numr de secven&! 4ac ,ncerca&i s actualiza&i coloana la o valoare care e.ist deAa, se va produce o eroare =cu
e.cep&ia situa&iilor c-nd se ,nt-mpl s con#igura&i coloana la o valoare pe care o are deAa>! 4ac actuali/Kza&i
coloana la o valoare mai mare dec-t orice valoare e.istent ,n coloan, secven&a va continua cu numrul urmtor
celui pentru ,nregistrrile ulterioare!
7aloarea celui mai recent numr de secven& generat automat este disponi$il prin apelarea #unc&iei
L(S"N*S+)"N*4=>! (ceasta v permite s #ace&i re#erire la valoarea (U"3N*C)+M+" ,n alte instruc&iuni,
#r a cunoa%te care este de #apt valoarea! L(S"N*S+)"N*4=> este legat de valorile (U"3N*C)+M+"
generate ,n timpul sesiunii curente a serverului0 nu este a#ectat de activitatea (U"3N*C)+M+" asociat cu
al&i clien&i! 4ac nici o valoare (U"3N*C)+M+" nu #ost generat ,n timpul sesiunii curente, #unc&ia
L(S"N*S+)"N*4=> returneaz 0!
Posi$ilitatea de a genera automat numerele dintr/o secven& este e.trem de util! "otu%i, comportarea descris
anterior are dou dezavantaAe! PrimulJ reutilizarea valorilor dintr/o secven& atunci c-nd sunt %terse ,nregistrrile
din partea superioar a secven&ei ,ngreuneaz generarea unui set de valori monotone =strict cresctoare> pentru
aplica&ii care pot %terge, dar careW pot %i insera ,nregistrri, ,n al doilea r-nd, miAloacele prin care ,ncepe&i o
secven& la o valoare mai mare dec-t l sunt greoaie!
(U"3N*C)+M+" pentru versiunile MySQL ,ncep-nd de la 222
MySQL 2!<2 a introdus urmtoarele sc?im$ri ,n comportarea atri$utului (U"3N*C)+/M+" ,n ceea ce
prive%te aspectele re&inute anteriorJ
7alorile dintr/o serie generat automat sunt strict cresctoare si nu sunt re#olosite! 4ac valoarea ma.im este
182 %i dumneavoastr %terge&i ,nregistrarea care con&ine valoarea respectiv, MySQL va genera valoarea
urmtoare egal cu 188!
Pute&i speci#ica numrul de secven& ini&ial ,n mod e.plicit atunci c-nd crea&i ta$elul! +.emplul urmtor
creeaz un ta$el cu o coloan (U"3N*C'+M+" denumit sec, care ,ncepe de la valoarea 1!000!000J
C)+("+ "(5L+ ta$elulAneu
=sec *" US*I+4 (U"3N*C)+M+" 3" ULL P)*M()O ]+O>
(U"3N*C)+M+" b 1000000
C-nd un ta$el are mai multe coloane =ca maAoritatea ta$elelor>, nu e.ist nici un du$iu cu privire la coloana
creia i se aplic clauza #inal (U"3N*C)+M+" b 1000000, deoarece ,ntr/un ta$el e.ist o singur coloan
(U"3N*C)+M+"!
KcV7MO
K S ddedfdVeK
0d,_i/l#
i,Ws_
118 Partea l Utilizarea general a sistemului MySQL (specte de re&inut privind atri$utul
(U"3N*C)+M+"
"re$uie s re&ine&i urmtoarele elemente pentru a evita surprizele atunci c-nd #olosi&i coloane
(U"3N*C)+M+"J
(U"3N*C)+M+" nu este un tip de coloan0 este un atri$ut al unui tip de coloan! Mai departe,
(U"3N*C)+M+" este un atri$ut destinat a #i utilizat numai pentru tipuri ,ntregi! 7ersiunile de MySQL
anterioare versiunii 2!<2 nu aplic aceast restric&ie cu stricte&e si v vor permite s declara&i un tip de coloan
cum ar #i C'() cu atri$utul (U"3N*C)+/M+"! "otu%i, numai tipurile ,ntregi #unc&ioneaz corect drept
coloane (U"3N*C)+M+"!
Scopul principal al mecanismului (U"3N*C)+M+" este acela de a v permite s genera&i o secven& de
,ntregi pozitivi0 cel mai indicat este s #olosi&i coloanele (U"3N*C)+M+" numai ,n acest mod! 4in acest
motiv, tre$uie s declara&i coloanele (U"3N*C)+M+" ca #iind US*I+4, ceea ce are ,n plus %i avantaAul
de a v o#eri de dou ori mai multe numere ,n secven& ,nainte de a aAunge la limita superioar a domeniului
tipului de coloan!
,n anumite circumstan&e, este posi$il s genera&i secven&e de valori negative #olosind o coloan
(U"3N*C)+M+", dar nu v recomand aceast opera&ie! 4ac sunte&i ?otr-t s o ,ncerca&i, nu uita&i s
e#ectua&i testri adecvate %i s re/e#ectua&i testrile dac trece&i la o versiune mai recent, di#erit, de MySQL!
Propriile mele e.perien&e au scos ,n eviden& o comportare oarecum inconsecvent a versiunilor ,n ceea ce
prive%te secven&ele de numere negative!
u v lsa&i amgit de ideea c adugarea atri$utului (U"3N*C)+M+" la o declara&ie de coloan este o
modalitate magic de a o$&ine o secven& nelimitat de numere! ici i vor$ de a%a ceva0 secven&ele
(U"3N*C)+M+" sunt limitate de domeniul tipului deR coloan! 4e e.emplu, dac #olosi&i o coloan
"*O*" US*I+4, numrul ma.im de A secven& este <@@! C-nd aAunge&i la aceast limit, aplica&ia
dumneavoastr va ,ncepe s A ,nregistreze erori de genul 6c?eie duplicat1!
MySQL 2!<2 a introdus noile caracteristici ale atri$utului (U"3N*C)+M+" de a tail re#olosi numerele de
secven& si de a v permite s speci#ica&i un numr ini&ial del secven& ,n instruc&iunea C)+("+ "(5L+! (ceste
caracteristici sunt anulate dac %terge&i0R toate ,nregistrrile din ta$el #olosind o instruc&iune 4+L+"+ de #orma
urmtoareJ
4+L+"+ F)3M numeNta$el
,n acest caz, secven&a va ,ncepe de la l, ,n loc s continue ,ntr/o ordine strict cresctoare,0 Secven&a reia
numrtoarea de la l c?iar dac instruc&iunea dumneavoastr C)+("+* "(5L+ speci#ic ,n mod e.plicit un
numr ini&ial de secven&! (cest lucru se produc datorit modului ,n care MySQL optimizeaz instruc&iunile
4+L+"+ care golesc ,n, ,ntregime un ta$elJ re/creeaz datele si #i%ierele inde. de la zero, ,n loc de a %terge #ie
,nregistrare, ceea ce determin pierderea tuturor in#orma&iilor despre numerele de secven&! 4ac dori&i s
%terge&i toate ,nregistrrile, dar s pstra&i in#orma&iile d\^ secven&, pute&i suprima optimizarea si #or&a&i MySQL
s e.ecute ,n sc?im$ o opera&iW de %tergere r-nd cu r-nd, ast#elJ
4+L+"+ F)3M numeNta$el U'+)+ 1 V 3 Ce pute&i #ace pentru a pstra o serie strict cresctoare dac ave&i
o versiune de MySQll mai vec?e dec-t 2!<2g 3 solu&ie este de a #olosi un ta$el separat, pe care ,l #olosi&i numa
pentru generarea de valori (U"3N*C)+M+" %i din care nu %terge&i niciodat ,nregistrrii
dK_r
d2'
S#a
ddgd /S V
Af@1/S Ag Sd! / W M
Capitolul < Lucrul cu date ,n MySQL %i SQL 11@
(st#el, valorile din ta$el nu sunt re#olosite niciodat! C-nd tre$uie s genera&i o ,nregistrare nou ,n ta$elul
dumneavoastr principal, mai ,nt-i insera&i o valoare ULL ,n ta$elul cu numere de secven&! (poi, insera&i
,nregistrarea ,n ta$elul dumneavoastr principal #olosind valoarea #unc&iei L(S"N*S+)"N*4=> pentru coloana
care dori&i s con&in un numr de secven&J
*S+)" *"3 aiNt$l S+" aiNcol b ULL
*S+)" *"3 t$lNprincipal S+" idbL(S"N*S+)"N*4=>! !!
S presupunem c dori&i s scrie&i o aplica&ie care genereaz valori (U"3N*C)+M+", dar dori&i ca secven&a
s ,nceap cu 100 ,n loc de 1! S mai presupunem c dori&i ca aplica&ia s #ie porta$il la toate versiunile de
MySQL! Cum pute&i realiza acest dezideratg 4ac dori&i s realiza&i porta$ilitatea, nu pute&i conta pe #aptul c
MySQL 2!<2 asigur speci#icarea numrului de secven& ini&ial ,n instruc&iunea C)+("+ "(5L+, ,n sc?im$,
c-nd dori&i s insera&i o interogare, mai ,nt-i veri#ica&i dac ta$elul este gol sau nu prin emiterea urmtoarei
instruc&iuniJ
S+L+C" C3U"=d> F)3M numeNta$el
(ceasta este o etap suplimentar, dar care nu v cost prea mult, deoarece instruc&iunea S+L+C" C3U"=d>
#r nici o clauz U'+)+ este optimizatL s se e.ecute rapid! 4ac ta$elul este vid, insera&i ,nregistrarea %i
speci#ica&i ,n mod e.plicit valoarea 100 pentru coloana numerelor de secven&! 4ac ta$elul nu este vid, pur %i
simplu speci#ica&i ULL pentru valoarea din coloana cu numrul de secven& si permite&i programului MySQL
s genereze automat urmtorul numr!
(ceast metod v permite s insera&i ,nregistrri cu numerele de secven& 100,101 si a%a mai departe si
#unc&ioneaz indi#erent dac MySQL permite sau nu speci#icarea valorii ini&iale a secven&ei! (ceast a$ordare nu
#unc&ioneaz dac impuneri ca numerele de secven& s #ie strict cresctoare c?iar %i atunci c-nd sunt %terse
,nregistrri din ta$el, ,n cazul respectiv, pute&i com$ina aceast metod cu te?nica descris anterior, de utilizare a
unui ta$el secundar strict pentru generarea numerelor de sec7en& care vor #i #olosite ,n ta$elul dumneavoastr
principal!
4e ce s ,ncepe&i o secven& cu o valoare mai mare dec-t l g Un motiv este de a determina toate numerele de
secven& s ai$ acela%i numr de ci#re! 4ac genera&i numere de identi#icare a clien&ilor si nu v a%tepta&i la mai
mult de un milion de clien&i, pute&i ,ncepe seria de la numrul 1!000!000! 7e&i putea insera cu mult peste un
milion de ,nregistrri ale clien&ilor ,nainte ca numrul de ci#re al identi#icatorului de client s se modi#ice!
3 alt modalitate de a #or&a o anumit dimensiune a numerelor de secven& este de a #olosi o coloan
P+)3F*LL, desigur! (cest procedeu poate ridica pro$leme, ,n #unc&ie de conte.tul ,n care v #olosi&i datele! 4e
e.emplu, dac manipula&i numere de secven& cu zerouri ini&iale ,n scripturi Perl sau P'P, va tre$ui s le #olosi&i
numai ca %iruri0 dac vor #i convertite ,n numere, zerourile ini&iale se vor pierde! Urmtorul script Perl scurt ilus/
treaz pericolele lucrului cu numere de acest genJ
hL usrM$inMperl
Ts b 1000101J h creeaz 1numr1 cu zerouri ini&iale
7Vt ddKKdK!!
/0YYg _,
prin& TsCC0
TsHn1
h #olose%te incrementul inteligent din Perl
11; Partea l Utilizarea general a sistemului MySQL
#olose%te Ts intr/un conte.t numeric
print 1TsHn10 Ts Cb 10 print 1TsHn10 C-nd este e.ecutat, acest script a#i%eaz urmtoarele date de ie%ireJ
00010 3]
00011 3]
1< 'opaL
3peratorul CC de auto/incrementare din Perl este inteligent si poate crea valori secven&iale din %iruri sau numere,
dar operatorul Cb #unc&ioneaz numai cu numere, ,n datele de ie%ire a#i%ate mai sus, pute&i vedea c operatorul
Cb cauzeaz o conversie %ir/numr, iar zerourile ini&iale din valoarea lui Ts se pierd!
(lte motive pentru a nu ,ncepe o secven& cu l s/ar putea s nu ai$ nici o legtur cu anumite considera&ii de
natur te?nic! 4e e.emplu, dac atri$ui&i numere de mem$ru, pute&i dori s ,ncepe&i o secven& la un numr mai
mare dec-t l, pentru a deAuca manevrele politice legate de identitatea mem$rului nr! l %i pentru a v asigura c un
asemenea numr nu e.ist! Se mai ,nt-mpl %i a%a ceva!!! "rist, dar adevrat!
Ienerarea secven&elor #r (U"3!*C)+M+"
3 alt metod de generare a numerelor secven&iale nu #olose%te o coloan (U"3N*C)+M+"! ,n sc?im$,
#olose%te #orma alternativ a #unc&iei L(S"N*S+)"N*4=>, care preia un argument! =(ceast #orm a #ost
introdus ,n MySQL 2!<<!:!> 4ac insera&i sau actualiza&i o coloan #olosind tN(S"N*S+)"N*4=e.pr>,
urmtorul apel la L(S"N*S+)"N*4=> #r nici un l argument va returna valoarea e.pr! Cu alte cuvinte, e.pr
este tratat ca %i cum ar #i #ost l generat de ctre mecanismul (U"3N*C)+M+"! (ceasta v permite s
genera&i un numr l de secven& %i apoi s/1 #olosi&i ,ntr/o instruc&iune ulterioar ,n cadrul sesiunii client, #r "
ca valoarea s #ie a#ectat de al&i clien&i!
3 modalitate de a #olosi aceast strategie este de a crea un ta$el cu un singur r-nd,d!^ con&in-nd o valoare care
este actualizat de #iecare dat c-nd ave&i nevoie de urmtoarea # valoare din secven&! 4e e.emplu, pute&i crea
ta$elul ,n acest modJ
C)+("+ "(5L+ secNta$el =sec *" US*I+4 3" ULL>
*S+)" *"3 secNta$el 7(LU+S=3> (ceste instruc&iuni creeaz ta$elul secNta$el si ,l ini&ializeaz cu un
singur r-nd, care con&ine o valoare sec egal cu 0! Pentru a #olosi ta$elul, genera&i urmtorul numr din l
secven&, dup cum urmeazJ
UP4("+ secNta$el S+" sec b L(S"N*S+)"N*4=secC1> (ceast instruc&iune regse%te valoarea curent a
coloanei sec %i o incrementeaz cu l %l pentru a genera urmtoarea valoare din secven&! Ienerarea noii valori
#olosindA, L(S"N*S+)"N*4=secC1> determin tratarea acesteia ca %i cum ar #i #ost o valoareW
(U"3N*C)+M+", iar valoarea poate #i regsit printr/o instruc&iune ulterioar, apel-ndL #unc&ia
L(S"N*S+)"N*4 => #r argument! (cest procedeu #unc&ioneaz c?iar dac un al&i client a generat ,ntre timp
un alt numr din secven&, deoarece L(S"N*S+)"N*4=> estel speci#ic #iecrui client ,n parte!
1 /!, yid!Y
W#dg!tK
Capitolul < Lucrul cu date ,n MySQL %i SQL 11D
4e asemenea, pute&i #olosi aceast metod dac dori&i s genera&i valori secven&iale care se incrementeaz cu o
valoare di#erit de l, respectiv valori secven&iale negative! 4e e.emplu, urmtoarele dou instruc&iuni pot #i
#olosite pentru a genera o secven& de numere care cresc cu c-te 100 de unit&i, respectiv o secven& de numere
negativeJ
UP4("+ secAta$el S+" sec b L(S"N*S+)"N*4=secC100>
UP4("+ secAta$el S+" sec b L(S"N*S+)"N*4=sec/1>
Mai pute&i #olosi aceast metod %i pentru generarea unei secven&e care ,ncepe de la o valoare ar$itrar prin
sta$ilirea ,n coloana sec a unei valori ini&iale adecvate!
Pentru o aplica&ie a acestei metode de generare a secven&elor pentru mai multe contoare, vezi 6Con#igurarea unui
ta$el contor1 ,n capitolul 2, 6Sinta.a %i utilizarea SQL ,n MySQL1!
"ipuri de coloana %ir
MySQL #urnizeaz numeroase tipuri de %iruri pentru stocarea datelor de tip caracter! Eirurile sunt #recvent
#olosite pentru valori ca acesteaJ
1lonescu, Popescu ` Co!1
1Creioane =mina nr! <>1
1Str! Lunga, nr! 1<2d
1Seria Monograp? *B1
4e #apt, %irurile sunt ,ntr/un #el tipuri generice, deoarece le pute&i #olosi pentru a reprezenta orice valoare! 4e
e.emplu, pute&i #olosi tipurile %ir pentru a stoca date $inare, cum sunt imaginile sau sunetele, respectiv date de
ie%ire din programul g zip, dac dori&i s stoca&i date comprimate!
Pentru toate tipurile %ir, valorile prea lungi sunt 6tiate1 pentru a corespunde lungimii sta$ilite! 4ar tipurile %ir
variaz de la #oarte mici la #oarte mari, iar tipul cel mai mare poate con&ine aproape 8I5 de date, deci tre$uie s
pute&i gsi ceva su#icient de lung pentru a evita trunc?ierea in#orma&iilor dumneavoastr8!
"a$elul <!9 prezint tipurile #urnizate de MySQL pentru declararea coloanelor cu valori de tip %ir, precum %i
dimensiunea ma.im %i spa&iul de stocare necesar pentru #iecare tip! Pentru tipuri de coloane cu lungime
varia$il, cantitatea de spa&iu ocupat de o valoare variaz de la un r-nd la altul %i depinde de lungimea valorilor
e#ectiv stocate ,n coloan! (ceast lungime este reprezentat ,n ta$el prin litera L!
3cte&ii suplimentari necesari ,n a#ara lui L reprezint numrul de octe&i necesari pentru a stoca lungimea valorii!
MySQL manipuleaz valorile de lungime varia$il prin stocarea at-t a con&inutului valorii, c-t %i a lungimii sale!
(ce%ti octe&i suplimentari sunt trata&i ca un ,ntreg #r semn! 3$serva&i coresponden&a ,ntre lungimea ma.im a
unui tip de lungime varia$il, numrul de octe&i suplimentari necesari pentru tipul respectiv %i domeniul tipului
,ntreg #r semn care #olose%te acela%i numr de octe&i! 4e e.emplu, valorile M+4*UM5L35 pot avea
ma.imum <<8/l octe&i lungime si necesit 2 octe&i pentru ,nregistrarea rezultatului! "ipul ,ntreg pe 2 octe&i
M+4*UM*" are o valoare #r semn ma.im de <<8/l! (ceasta nu este o coinciden&!
KdtHs W
1! K11Ki eKK r ,, vg1g#c!
4atorit limitrilor impuse de dimensiunea ma.im a pac?etului ,n protocolul de comunica&ie clientMserver,
limita e#icace a valorilor din coloan este de <8M5! / !(!
119 Partea l Utilizarea general a sistemului MySQL "a$elul <!9 "ipuri de coloane %ir!
Speci#ica&ia tipului
C'()=M> 7()C'() =U> "*O5L35, "*O"+B" 5L35, "+B"
M+4*UM5L35, M+4*UM"+B" L3I5L35, L3I"+B" +UM =1val17val<1,!!!> S+" =1vair,1val<1,!!!>
4imensiune ma.im
M octe&i u octe&i <9/1 octe&i <1;/1 octe&i <<8/1 octe&i <2</1 octe&i ;@@2@ mem$ri ;8 mem$ri
Spa&iu necesar
U octe&i
L C1 octe&i
L C1 octe&i
L C < octe&i
L C 2 octe&i
L C 8 octe&i
1 sau < octe&i
1,<,2,8 sau 9 octe&i
"ipurile de coloane C'() %i 7()C'()
C'() si 7()C'() sunt cele mai #olosite tipuri %ir! 4i#eren&a dintre ele const ,n aceea c C'() este un tip
de lungime #i., iar 7()C'() este un tip de lungime varia$il! 7alorile dintr/o coloan C'() =M> ocup
#iecare c-te M octe&i0 valorile mai scurte sunt completate la dreapta cu spa&ii atunci c-nd sunt stocate! ="otu%i, la
regsirea acestor valori, spa&iile #inale sunt eliminate!> 7alorile dintr/o coloan 7()C'() =M> sunt stocate
#olosind numai cantitatea de octe&i necesar, plus un octet pentru ,nregistrarea lungimii@!
4ac lungimea valorilor dumneavoastr nu variaz prea mult, C'() este o op&iune mai $un dec-t 7()C'(),
deoarece ta$elele cu r-nduri de lungime #i. pot #i prelucrate mai e#icient dec-t ta$elele cu lungime varia$il!
4ac valorile dumneavoastr au toate aceea%i lungime, 7()C'() va #olosi, de #apt, un spa&iu mai mare,
datorit octetului suplimentar utilizat pentru ,nregistrarea lungimii valorilor!
(nterior versiunii MySQL 2!<2, coloanele C'() %i 7()C'() pot #i declarate cu o lungime ma.im M
cuprins ,ntre l si <@@! ,ncep-nd de la versiunea MySQL 2!<2, C'()=3> este de asemenea o valoare permis!
C'()=3> este util ca element de ,nlocuire atunci c-nd dori&i s declara&i o coloan, dar nu vre&i s aloca&i spa&iu
pentru aceasta dac nu sunte&i sigur de l&imea pe care dori&i s i/o atri$ui&i! Pute&i #olosi (L"+) "(5L+ pentru
a mri ulterior l&imea coloanei! 3 coloan C'()=3> poate #i de asemenea #olosit pentru a reprezenta valorile
pornitMoprit, dac ,i permite&i s ia valoarea ULL! 7alorile dintr/o asemenea coloan pot lua dou valori, ,n
spe& ULL si %irul vid! 3 coloan C'()=3> ocup un spa&iu de stocare #oarte redus ,n interiorul ta$eluluiJ un
singur $it!
Cu anumite e.cep&ii limitate, nu pute&i com$ina C'() %i 7()C'() ,n interiorul aceluia%i ta$el! MySQL va
proceda c?iar la modi#icarea coloanelor de la un tip la altul, ,n #unc&ie de circumstan&e! =(cesta este un lucru care
nu se ,nt-mpl ,n cadrul altor sisteme de $aze de date!> Principiile care se aplic sunt urmtoareleJ
"a$elele cu r-nduri de lungime #i. sunt prelucrate mai u%or dec-t ta$elele cu r-nduri de lungime varia$il!
=Motivele vor #i discutate ,n sec&iunea 6(legerea tipurilor de coloane1!>
K Spa#iile #inale sunt eliminate la stocarea valorilor0 acest procedeu di#er de standardul (S* pentru SQL ,n ceea
ce prive%te valorile de tip 7()C'()! / !(!
Capitolul < Lucrul cu date ,n MySQL %i SQL 11:
)-ndurile unui ta$el au lungime #i. numai dac toate coloanele din ta$el sunt tipuri cu lungime #i.! 4ac #ie
%i o singur coloan are lungime varia$il, r-ndurile ta$elului devin %i ele de lungime varia$il!
4eoarece avantaAele de per#orman& ale r-ndurilor de lungime #i. se pierd atunci c-nd r-ndul devine de
lungime varia$il, toate coloanele de lungime #i. pot #i convertite ,n ec?ivalente de lungime varia$il, atunci
c-nd o atare msur poate duce la economii de spa&iu!
(ceasta ,nseamn c, dac ave&i coloane 7()C'() ,ntr/un ta$el, nu pute&i avea %i coloane C'()0 MySQL le
converte%te 6pe tcute1 ,n 7()C'()! S presupunem c a&i creat un ta$el ca acestaJ
C)+("+ "(5L+ ta$elulAneu
c1 C'()=10>, c< 7()C'()=10> > 4ac emite&i o interogare 4+SC)*5+ ta$elulAneu, datele de ie%ire se
prezint ast#elJ
Field "ype uli ]ey 4e#ault +.tra
C1
c<
varc?ar=10>
varc?ar=10>
O+S
O+S
ULL
ULL

3$serva&i c prezen&a coloanei 7()C'() determin programul MySQL s converteasc %i coloana c1 la tipul
7()C'()! 4ac ,ncerca&i s #olosi&i (L"+) "(5L+ pentru a converti c1 la C'(), nu ve&i reu%i! Unica
modalitate de a trans#orma o coloan 7()C'() ,n coloan C'() este de a converti toate coloanele
7()C'() din ta$el ,n acela%i timpJ
(L"+) "(5L+ ta$elulAneu M34*FO c1 C'()=10>, M34*FO c< C'()=10> "ipurile de coloane 5L35 %i
"+B" sunt de lungime varia$il, ca %i 7()C'(), dar nu au nici un ec?ivalent de lungime #i., deci nu pute&i
#olosi coloane C'() ,n acela%i ta$el ca si coloanele 5L35 %i "+B"! 3rice coloan C'() va #i convertit la
7()C'()!
+.cep&ia de la regula neutilizrii ,n acela%i ta$el a coloanelor de lungime #i. %i a celor de lungime varia$il
const ,n aceea c acele coloane de tip C'() mai scurte de patru caractere nu sunt convertite la 7()C'()! 4e
e.emplu, MySQL nu va trans#orma coloana C'() din urmtorul ta$el ,n 7()C'()J C)+("+ "(5L+ ta$elul
meu
C1 C'()=<>,
c< 7()C'()=10> >
Motivul pentru care coloanele mai scurte de patru caractere nu sunt convertite este acela c, ,n medie, economia
de spa&iu pe care o pute&i o$&ine prin nestocarea spa&iilor #inale este anulat de octetul suplimentar necesar ,ntr/o
coloan 7()C'() pentru ,nregistrarea lungimii #iecrei valori! 4e #apt, dac toate coloanele dumneavoastr
sunt scurte, MySQL va converti la C'() orice coloan declarat ca 7()C'()! MySQL procedeaz ast#el
deoarece conversia nu va mri, ,n medie, cantitatea de spa&iu necesar %i va ,m$unt&i
1<0 Partea l Utilizarea general a! sistemului MySQL
per#orman&ele prin trans#ormarea r-ndurilor ta$elului ,n r-nduri de lungime #i.! 4ac crea&i un ta$el cu
urmtoarea speci#ica&ie, coloanele 7()C'() vor #i toate convertite 6discret1 ,n C'()J
C)+("+ "(5L+ ta$elul meu
c1 7()C'()=1>, C< 7()C'()=<>, C2 7()C'()=2>
Pute&i veri#ica modi#icarea coloanelor prin e.aminarea datelor de ie%ire ale interogrii * 4+SC)*5+ ta$elul meuJ
Field "ype uli ]ey 4e#ault +.tra
C1
c< c2
c?ar=1> c?ar=<>
c?ar=2>
O+S
O+S
O+S
ULL
ULL
ULL

"ipurile de coloane 5L35 %i "+B"
Un 15L351 este un o$iect $inar mare =$inary Marge o$Aect>, ,n esen& un container care poate stoca orice dori&i s
pune&i ,n el %i pe care ,l pute&i #ace aproape oric-t de mare i dori&i, ,n MySQL, tipul 5L35 este de #apt o #amilie
de tipuri ="*O5L35, 5L35, M+4*UM/5L35, L3I5L35> care sunt identice, cu e.cep&ia cantit&ii
ma.ime de in#orma&ii pe care o pot stoca =vezi ta$elul <!9>! MySQL mai are o #amilie de tipuri "+B"
="*O"+B", "+B"0 ^ M+4*UM"+B", L3Q"+B">! (cestea sunt identice din toate punctele de vedere cu
tipurile i 5L35 corespunztoare, cu e.cep&ia #aptului c, la comparare si sortare, valorile 5L35 sunt A sensi$ile
la di#eren&a ,ntre maAuscule %i minuscule, ,n timp ce valorile "+B" nu sesizeaz S aceast di#eren&! Coloanele
5L35 si "+B" sunt utile pentru stocarea datelor care po&i deveni #oarte mari sau care pot varia #oarte mult ca
dimensiune de la un r-nd la altul! \ Printre e.emple se numr documentele create cu procesoarele de te.t,
imaginile sunetele, datele compuse %i articolele de %tiri!
Coloanele 5L35 %i "+B" pot #i inde.ate ,ncep-nd de la MySQL 2!<2!<, de%i tre$uie s^ speci#ica&i o dimensiune
a pre#i.ului care va #i #olosit pentru inde., cu scopul de a evitai intrrile de inde. care pot deveni enorme si care
pot, ca atare, s anuleze toate av-ntagL Aele do$-ndite prin utilizarea acelui inde.! 4e asemenea, ,n general nu se
e#ectueaz cutri ,n coloane 5L35 sau "+B", deoarece coloane ca acestea con&in deseori date $inare A =precum
imaginile>! Se o$i%nuie%te mai #recvent s se utilizeze alte coloane din ta$el pen/1 tru ,nregistrarea unui anumit
tip de in#orma&ii de identi#icare re#eritoare la valorile 5L35 ^ sau "+B" %i s se #oloseasc acele in#orma&ii
pentru a determina r-ndurile dorite!
Coloanele 5L35 %i "+B" pot necesita o aten&ie specialJ
4atorit varia&iilor mari caracteristice ale dimensiunilor coloanelor 5L35 %i "+B", lele care le con&in sunt
supuse unor #ragmentri de propor&ii dac sunt e#ectuate nug i meroase %tergeri %i actualizri! 7a #i necesar s
rula&i periodic instruc&iunea 3P"*M*P(* "(5L+ pentru a reduce #ragmentarea %i pentru a pstra un nivel ridicat
de per#orman&ii S 7ezi capitolul 8, 63ptimizarea interogrilor1, pentru mai multe in#orma&ii! til
Capitolul < Lucrul cu date ,n MySQL %i SQL 1 <1
4ac #olosi&i valori #oarte mari, poate #i necesar s aAusta&i serverul ,n vederea cre%terii valorii parametrului
ma.Nallo[edNpacGet! 7ezi capitolul 11, 6(dministrarea general a sistemului MySQL1, pentru mai multe
in#orma&ii! 4e asemenea, va tre$ui s mri&i dimensiunea pac?etului pentru orice client care dore%te s #oloseasc
valori #oarte mari! (ne.a +, 6)e#erin& de programe MySQL1, descrie aceast opera&ie pentru clien&ii mysjl %i
mysjldump!
"ipurile de coloane +UM %i S+"
+UM %i S+" sunt tipuri de %iruri speciale pentru care valorile coloanelor tre$uie alese dintr/un set #i. de %iruri!
Principala di#eren& dintre cele dou tipuri este c valorile coloanelor de tip +UM tre$uie s #ie alctuite dintr/
un singur mem$ru al setului de valori, ,n timp ce valorile dintr/o coloan S+" pot con&ine oricare mem$ru al
setului sau c?iar pe to&i mem$rii! Cu alte cuvinte, +UM este #olosit pentru valori mutual e.clusive, ,n timp ce
S+" permite mai multe op&iuni dintr/o list de valori!
"ipul de coloan +UM de#ine%te o enumerare, ,n coloanele +UM se pot repartiza valori alctuite din e.act un
mem$ru ales dintr/o list de valori speci#icat ,n momentul crerii ta$elului! 3 enumerare poate avea ma.imum
;@@2; mem$ri =din care unul este rezervat de ctre MySQL>! +numerrile se #olosesc #recvent pentru a
reprezenta valorile dintr/o categorie! 4e e.emplu, valorile dintr/o coloan declarat ca +UM = 11 , 141 > pot
#i numai 11 sau 141! (lternativ, pute&i #olosi +UM pentru rspunsuri la ,ntre$ri cu op&iuni multiple dintr/un
c?estionar sau studiu, respectiv pentru mrimile %i culorile unui produsJ
salaria&i +UM=1su$ 1001, 1100/@001 ,1@01 /1@001, 1peste 1@001>
culoare +UM=1rosu1 ,1 verde1 Mal$astru1, 1negru1>
mrime +UM=1S1, 1M1 , 1L1 ,1BL1 , 1BBL1>
4ac prelucra&i selec&ii din pagini Ue$, pute&i #olosi +UM pentru a reprezenta op&iunea pe care un vizitator al
sitului dumneavoastr o alege dintr/un set de $utoane radio mutual e.clusive plasate ,ntr/o pagin! 4e e.emplu,
dac averi un serviciu pe *nternet pentru comenzi de pizza, se poate #olosi o enumerare pentru a reprezenta tipul
de coaA comandat de un clientJ
coaAa +UM= 1su$&ire1 Mnormala1, 1stil pan1>
,n cazul ,n care categoriile de enumerare reprezint numere, este important s v alege&i categoriile ,n mod
corespunztor atunci c-nd crea&i enumerarea! 4e e.emplu, c-nd ,nregistra&i numrul de leucocite rezultat ,n
urma unui test de la$orator, pute&i grupa numerele ,n categorii ,n acest modJ
leucocite +UM= 10/1001 ,1101 /2001 , 1V2001 >
C-nd rezultatul testului este dat su$ #orma unei valori e.acte, pute&i ,nregistra valoarea su$ #orma categoriei ,n
care se ,ncadreaz aceasta! u pute&i ,ns reveni la valoarea original dac decide&i s converti&i coloana dintr/o
enumerare $azat pe categorii ,ntr/o coloan de ,ntregi, compus din valori e.acte!
"ipul S+" este similar cu +UM ,n sensul c, atunci c-nd crea&i o coloan S+", speci#ica&i o list cu nem$rii
permi%i ai setului! 4ar, spre deose$ire de +UM, #iecare valoare a coloanei poate #i alctuit din orice numr de
mem$ri ai setului! Setul poate avea ma.imum ;8 de mem$ri! Pute&i #olosi un S+" atunci c-nd ave&i un set #i. de
valori care nu sunt mutual e.clusive, a%a cum este cazul ,n coloana +UM! 4e e.emplu, pute&i #olosi S+"
pentru a reprezenta op&iunile disponi$ile pentru un autoturismJ
,! W6(y,,,_, 7ScAi K K,"d/LiK VLhM
1<< Partea l Utilizarea general a sistemului MySQL
S+"=1port$agaA1,1pilot automat1,1aer condi&ionat1,1trapa1> (poi, valorile particulare din S+" vor reprezenta
op&iunile e#ectiv comandate de clien&iJ
S+"=1pilot automat,trapa1>
S+"=1port$agaA,aer condi&ionat1>
S+"=1port$agaA,pilot automat,aer condi&ionat1>
S+"=1aer condi&ionat1>
S+"=11>
Eirul vid indic #aptul c un client nu a comandat nici o op&iune! (ceasta este o valoare admis pentru S+"!
7alorile din coloana S+" sunt reprezentate su$ #orma unui %ir unic! 4ac o valoare este alctuit din mai mul&i
mem$ri ai unui set, mem$rii sunt separa&i ,n interiorul %irului prin virgule! +vident, aceasta ,nseamn c nu
tre$uie s #olosi&i un %ir care include o virgul ca mem$ru al unei coloane S+"!
Coloanele S+" mai pot #i utilizate pentru reprezentarea unor in#orma&ii precum diagnosticele unor pacien&i sau
rezultate din selec&ii e#ectuate ,n pagini Ue$! Pentru un diagnostic, poate e.ista o list standard de simptome a
cror =in>e.isten& tre$uie a#lat de la pacient, iar acesta poate prezenta oricare simptom sau pe toate! Pentru
serviciul dumneavoastr de comenzi de pizza prin *nternet, pagina Ue$ pentru comenzi poate avea un set de
casete de validare pentru ingredientele din pizza pe care le dore%te clientul, ingrediente din care se pot alege mai
multe!
Modul ,n care declara&i lista cu valori admise pentru o coloan +UM sau S+" este important din mai multe
puncte de vedereJ
Lista determin valorile admise posi$ile care pot #i incluse ,n coloan, a%a cum s/a artat anterior!
Pute&i insera valori +UM si S+" #olosind at-t maAuscule, c-t %i minuscule, dar mrimea literelor pentru
%irurile speci#icate ,n declara&ia coloanei determin mrimea literei valorilor coloanei atunci c-nd acestea sunt
regsite ulterior! 4e e.emplu, dac ave&i o coloan +UM =1 41,1 1> si stoca&i ,n coloan valorile 1 d1 %i1 n1,
valorile sunt a#i%ate su$ #orma 141 %i 11 atunci c-nd le regsi&i! (cest #apt nu a#ecteaz comportarea tipurilor
respective la compara&ie sau sortare, deoarece coloanele +UM %i S+" nu sunt sensi$ile la di#eren&a ,ntre
maAuscule %i minuscule!
3rdinea valorilor dintr/o declara&ie +UM este ordinea #olosit pentru sortare! 3rdinea valorilor dintr/o
declara&ie S+" determin de asemenea ordinea de sortare, de%i rela&ia este mai complicat ,n acest caz, deoarece
valorile coloanelor pot con&ine mai mul&i mem$ri ai setului!
3rdinea valorilor dintr/o declara&ie S+" determin ordinea ,n care apar su$/%irurile atunci c-nd sunt a#i%ate
valorile din coloana S+" care sunt alctuite din mai mul&i mem$ri ai unui set!
+UM %i S+" sunt clasi#icate ca tipuri %ir, deoarece mem$rii enumerrii, respectiv ai setului, sunt speci#ica&i su$
#orm de %ir atunci c-nd crea&i coloane de aceste tipuri! "otu%i, mem$rii sunt stoca&i intern su$ #orm de numere
%i pute&i lucra cu ei ca atare! (ceasta ,nseamn c tipurile +UM %i S+" sunt mai e#iciente dec-t alte tipuri %ir,
deoarece pot #i
Capitolul < Lucrul cu date ,n MySQL %i SQL 1<2
manipulate #recvent #olosind opera&ii numerice ,n locul opera&iilor cu %iruri! 4e asemenea, ,nseamn c valorile
+UM %i S+" pot #i #olosite at-t ,n conte.te numerice, c-t %i ,n conte.te cu %iruri!
Mem$rii +UM din declara&ia coloanei sunt numerota&i secven&ial, ,ncep-nd de la 1! =3 este #olosit de MySQL
pentru mem$rul 6eroare1, care este reprezentat su$ #orm de %ir prin %irul vid!> umrul valorilor dintr/o
enumerare determin dimensiunea spa&iului de stocare al unei coloane +UM! Un octet poate reprezenta <@; de
valori, doi octe&i pot reprezenta ;@@2; de valori! =Compara&i aceste valori cu domeniile tipurilor ,ntregi pe un
octet si pe doi octe&i "*O*" US*I+4 si SM(LL*" US*I+4!> (st#el, numrul ma.im de mem$ri ai
unei enumerri este ;@@2; =inclusiv mem$rul 6eroare1>, iar dimensiunea spa&iului de stocare depinde de
e.isten&a sau nu a unui numr de mem$ri mai mare de <@;! Pute&i speci#ica un numr ma.im de ;@@2@ =nu
;@@2;> de mem$ri ,n declara&ia +UM, deoarece MySQL rezerv un spa&iu pentru mem$rul 6eroare1 ca mem$ru
implicit al #iecrei enumerri! C-nd atri$ui&i o valoare incorect ,ntr/o coloan +UM, MySQL repartizeaz ,n
sc?im$ mem$rul 6eroare1!
*at un e.emplu pe care ,l pute&i ,ncerca #olosind clientul mysjl! +.emplul prezint ordonarea numeric a
mem$rilor unei enumerri %i demonstreaz, de asemenea, c valoarea ULL nu are nici un numr ,n cadrul
ordonriiJ
mysjlV C)+("+ "(5L+ eNta$el =e +UM=1ana1,1ion1,1nae1,1ela1>>0
mysjlV *S+)" *"3 eNta$el
7(LU+S=1ana1>,=1ion1>,=1nae1>,=1ela1>,=11>, =ULL>0
mysjlV S+L+C" e, eC0, eC1, ed2 F)3M eNta$el0
e eC0 eC1 ed2
ana 1 < 2
ion < 2 ;
nae 2 8 :
ela 8 @ 1<
0 1 0
ULL ULL ULL ULL
Pute&i e#ectua opera&ii cu mem$rii enumerrii ,n #unc&ie de nume sau de numrJ mysjlV S+L+C" e F)3M
eNta$el U'+)+ ebKnae10
nae
nae
mysjlV S+L+C" e F)3M eAta$el U'+)+ eb20 e
Se poate declara %irul vid ca mem$ru permis al unei enumerri! (cestui %ir i se va! atri$ui o valoare numeric
di#erit de zero, ca oricrui alt mem$ru men&ionat ,r declara&ie! "otu%i, utilizarea unui %ir vid poate provoca
oarecare derut, deoarece %irul respectiv este de asemenea #olosit pentru mem$rul 6eroare1, a crui valoare
numeric este 0! ,n e.emplul urmtor, repartizarea valorii de enumerare incorecte 1.1 ,n coloana +UM
determin
0/0WVV!
\, `i,sdV
m/
1<8 Partea l Utilizarea general a sistemului MySQL
repartizarea mem$rului de eroare! (cesta poate #i di#ereren&iat de mem$rul %ir vid numai atunci c-nd este regsit
,n #orm numericJ
mysjlV C)+("+ "(5L+ t =e +UM=1a1,11,K$K>>0
mysjlV *S+)" *"3 t 7(LU+S=Ka1>,=11>,=1$1>,=1.1>0
mysjlV S+L+C" e eC0 F)3M t0
)eprezentarea numeric a coloanelor S+" este pu&in di#erit de aceea a coloanelor +UM! Mem$rii unui set nu
sunt numerota&i secven&ial, ,n sc?im$, #iecrui mem$ru ,i corespunde unui $it individual ,n valoarea S+"! Primul
mem$ru al setului corespunde $itului 3, al doilea mem$ru corespunde $itului l etc! 3 valoare S+" numeric
egal cu 3 corespunde %irului vid! Mem$rii S+" sunt stoca&i ca valori pe $i&i! ,n acest mod se pot stoca ,n #iecare
octet c-te opt valori ale unui set, deci dimensiunea spa&iului de stocare a unei coloane S+" este determinat de
numrul de mem$ri ai setului, p-n la o valoare ma.im de ;8 de mem$ri! 7alorile S+" pot ocupa l, <,2,8 sau 9
octe&i pentru dimensiuni ale setului cuprinse respectiv ,ntre 1/9, :/1;, 1D/<8, <@/2< si 22/;8!
)eprezentarea unei valori S+" su$ #orma unui set de $i&i este cea care ,i permite unei asemenea valori s #ie
alctuit din mai mul&i mem$ri ai unui set! ,ntr/o valoare se poate sta$ili orice com$ina&ie de $i&i, deci valoarea
poate #i alctuit din orice com$ina&ie de %iruri din declara&ia S+" care corespund acestor $i&i!
*at un e.emplu care ilustreaz rela&ia dintre #orma %ir si #orma numeric a unei coloane S+"0 valoarea numeric
este a#i%at at-t ,n #orm zecimal, c-t si ,n #orm $inarJ
mysjlV C)+("+ "(5L+ sNta$el =s S+"=1ana/,1ion1,/nae1,1ela1>>0
mysjlV *S+)" *"3 sNta$el
7(LU+S=1ana1>, =1ion1>, =1naeK>,Cela1>,=1>,=ULL>0
mysjlV S+L+C" s, sC0, 5*=sC0> F)3M sNta$el0
s sCo 5*=sC0>
ana 1 1
ion < 10
nae 8 100
ela 9 1000
0 0
ULL ULL ULL
4ac repartiza&i ,ntr/o coloan S+" o valoare care con&ine su$/siruri ce nu au #o%ti men&ionate ca mem$ri ai
setului, aceste %iruri sunt eliminate si ,n coloan este repartizatL o valoare care const din su$/%irurile rmase!
C-nd repartiza&i valori ,n coloanele Sft,^ nu este necesar ca su$/%irurile s #ie men&ionate ,n aceea%i ordine pe
care a&i #olosit/oi atunci c-nd a&i declarat coloana! "otu%i, c-nd regsi&i valoarea ulterior, mem$rii vor #ii
men&iona&i ,n ordinea de declarare! S presupunem c speci#ica&i o coloan S+" pentru a^ reprezenta articole de
mo$ilier, #olosind urmtoarea declara&ieJ
Capitolul < Lucrul cu date ,n MySQL %i SQL 1<@
S+"=1masa1,1lampa1,1scaun1>
4ac repartiza&i ,n aceast coloan valoarea 1scaun,canapea,masa1, se vor ,nt-mpla dou lucruri! PrimulJ %irul
1canapea1 dispare, deoarece nu este un mem$ru al setului! (l doileaJ c-nd regsi&i valoarea ulterior, aceasta apare
su$ #orma1 masa, scaun1! (cest lucru se produce deoarece MySQL determin $i&ii care corespund #iecrui su$/
%ir al valorii care tre$uie repartizate %i ,i activeaz ,n cadrul valorii stocate! Su$/%irul1 canapea1 nu corespunde
nici unui $it si este ignorat! La regsire, MySQL construie%te valoarea %irului din valoarea numeric prin
parcurgerea $i&ilor ,n ordine, #apt care are ca e#ect reordonarea automat a su$/%irurilor ,n ordinea #olosit la
declararea coloanei! (ceast caracteristic mai are %i urmtoarea semni#ica&ieJ dac speci#ica&i un mem$ru al
setului de mai multe ori ,ntr/o valoare, acesta va aprea o singur dat la regsirea valorii! 4ac repartiza&i
valoarea 1lampa,lampa,lampa1 ,ntr/o coloan S+", la regsire aceasta va avea numai valoarea 1 lampa1!
Faptul c MySQL modi#ic ordinea mem$rilor dintr/o valoare S+" ,nseamn c, ,n cazul ,n care cuta&i valori
#olosind un %ir, tre$uie s enumera&i mem$rii ,n ordinea adecvat! 4ac insera&i 1scaun,masa1 si apoi cuta&i
1scaun,masa1, nu ve&i gsi nimic0 tre$uie s cuta&i valoarea 1masa, scaun1!
Sortarea %i inde.area coloanelor +UM %i S+" se realizeaz ,n con#ormitate cu valorile interne =numerice> ale
valorilor din coloana! +.emplul urmtor ar putea prea alt#el incorect, deoarece valorile nu sunt sortate ,n ordine
al#anumericJ mysjlV S+L+C" e F)3M eNta$el 3)4+) 5O e0
ULL
ana ion nae ela
7aloarea ULL apare dup sortare ,naintea altor valori =sau dup acestea, la sortarea ,n ordine descendent>!
Pute&i e.ploata sortarea +UM dac ave&i un set #i.at de valori %i dori&i s le sorta&i ,ntr/o anumit ordine!
(tri$ui&i coloanei tipul +UM c-nd crea&i ta$elul %i men&iona&i valorile din enumerare ,n declara&ia coloanei, ,n
ordinea ,n care dori&i s #ie sortate!
Pentru situa&ii ,n care dori&i ca o coloan +UM s #ie sortat ,n ordine le.icogra#ic normal, pute&i converti
coloana ,ntr/un %ir non/+UM #olosind C3C("= >%i sort-nd rezultatulJ mysjlV S+L+C" C3C("=e> (S
eNstr F)3M eNta$el 3)4+) 5O eNstr0
eNstr ULL
ana ela ion nae
1<; Partea l Utilizarea general a sistemului MySQL (tri$utele coloanelor de tip %ir
(tri$utul 5*()O poate #i speci#icat pentru tipurile C'() %i 7()C'() pentru a determina tratarea valorilor
din coloan su$ #orm de %iruri $inare =adic sensi$ile la di#eren&a ,ntre maAuscule si minuscule ,n cazul
opera&iunilor de comparare %i sortare>!
(tri$utele generale ULL sau 3" ULL pot #i speci#icate pentru oricare dintre tipurile %ir! 4ac nu speci#ica&i
nici unul din acestea, atri$utul presta$ilit este ULL! "otu%i, declararea unei coloane de tip %ir ca 3" ULL nu
,mpiedic introducerea unui %ir vid! 3 valoare vid este di#erit de o valoare ine.istent, deci nu #ace&i gre%eala
de a crede c pute&i #or&a o coloan %ir s con&in valori nevide declar-nd/o 3" ULL, ,n cazul ,n care cere&i ca
valorile %irurilor s #ie nevide, aceasta este o restric&ie pe care tre$uie s o impune&i ,n cadrul propriilor
dumneavoastr aplica&ii!
4e asemenea, pute&i speci#ica o valoare presta$ilit #olosind atri$utul 4+F(UL" pentru toate coloanele de tip %ir,
cu e.cep&ia tipurilor 5L35 %i "+B"! 4ac nu speci#ica&i o valoare presta$ilit, o asemenea valoare va #i aleas
,n mod automat! Pentru coloanele care potK0 con&ine ULL, valoarea presta$ilit este ULL! Pentru coloane care
nu pot con&ine ULL, valoarea presta$ilit este %irul vid, cu e.cep&ia tipului +UM, unde valoarea presta$ilit H
este primul mem$ru al enumerrii! =Pentru S+", valoarea presta$ilit ,ntr/o coloan care nu poate con&ine ULL
este de #apt setul vid, dar acesta este ec?ivalent cu %irul vid!>
Coloane de tip dat %i or
MySQL #urnizeaz numeroase tipuri de coloane pentru valorile temporaleJ 4("+, 4("+"*M+, A "*M+,
"*M+S"(MP %i O+()! "a$elul <!: prezint tipurile #urnizate de MySQL pentruR declararea coloanelor care
con&in valori pentru dat %i or, precum %i domeniul valorilorR permise pentru #iecare tip! "ipul O+() a #ost
introdus ,n MySQL versiunea 2!<<! Celelalte A tipuri au #ost prezente ,n toate versiunile MySQL! 4imensiunile
necesare ale spa&iului deA stocare pentru #iecare tip sunt prezentate ,n ta$elul <!10!
"a$elul <!: Coloane de tip dat %i or
Speci#ica&ia tipului 4omeniu #
4("+ ,ntre 11000/01/011 %i 1::::/1</211
"*M+ ,ntre 1/929J@:J@:1 %i 1929J@:J@:1 =
4("+"*M+ ,ntre 11000/01/01 00J00J001 %i 1::::/1</21 <2J@:J@:1
"*M+S"(MP Q=M>R ,ntre 1:D00101000000 %i undeva ,n anul <02D
O+()Q=M>R ,ntre 1:01 Ei <1@@
W
"a$el <!10 4imensiunile spa&iului de stocare necesare pentru coloanele de tip dat %i oral Speci#ica&ia tipului
4imensiuni necesare ale spa&iului de stocare
4("+ 2 octe&i =anterior versiunii MySQL 2!<<,8 octe&i>
"*M+ 2 octe&i
4("+"*M+ 9 3Cte&i
Capitolul < Lucrul cu date ,n MySQL %i SQL 1<D
Speci#ica&ia tipului
"*M+S"(MP O+()
4imensiuni necesare ale spa&iului de stocare
8 octe&i 1 octet
Fiecare tip dat %i or are o valoare 1 zero1 care este stocat atunci c-nd insera&i o valoare care este incorect
pentru tipul respectiv, a%a cum se poate vedea ,n ta$elul <!11! (ceast valoare este, de asemenea, valoarea
presta$ilit pentru coloanele de tip dat %i or care sunt declarate 3" ULL!
"a$elul <!11 7alorile 6zero1 pentru coloanele de tip dat %i or
Speci#ica&ia tipului
4("+
"*M+
4("+"*M+
"*M+S"(MP
O+()
7aloare 6zero1
10000/00/001 100J00J001
10000/00/00 00J00J001 3Q333333333333 0000
MySQL reprezint ,ntotdeauna datele ,ncep-nd cu anul, ,n con#ormitate cu speci#ica&ia (S*! 4e e.emplu, 2
decem$rie 1::: este reprezentat su$ #orma 11:::/1</021! MySQL este oarecum leAer privind modul ,n care
permite speci#icarea datelor de intrare! 4e e.emplu, va converti valorile anilor compuse din dou ci#re ,n valori
din patru ci#re, iar dumneavoastr nu tre$uie s #urniza&i un zero ini&ial pentru valorile lunilor %i zilelor care sunt
mai mici dec-t 10! "otu%i, tre$uie s speci#ica&i mai ,nt-i anul! Formatele cu care sunte&i mai o$i%nuit, precum
11<M2M::1 sau 12M1<M::1 vor #i interpretate incorect! )egulile #olosite de MySQL pentru interpretarea datelor sunt
discutate ,n detaliu ,n paragra#ul 6Lucrul cu coloanele de tip dat %i or1!
7alorile de tip or sunt returnate con#orm #usului orar local al serverului0 MySQL nu e.ecut nici un #el de
modi#icri ,n #unc&ie de #usul orar ale valorilor pe care le returneaz clientului!
"ipurile de coloane 4("+, "*M+ %i 4("+"*M+
"ipurile 4("+, "*M+ %i 4("+"*M+ con&in valori de date, ore %i valori com$inate de tip dat/or! Formatele
sunt 1((((/LL/PP1, 1??JmmJss1, 1((((/LL/PP ??JmmJss1! Pentru tipul 4("+"*M+, partea de dat %i cea
de or sunt o$ligatorii0 dac atri$uiri o valoare 4("+ unei coloane 4("+"*M+, MySQL adaug automat o parte
de or su$ #orma 1 00J00J001!
MySQL trateaz ora din valorile 4("+"*M+ %i "*M+ ,n moduri u%or di#erite! Pentru 4("+"*M+, partea de or
reprezint o or din zi! Pe de alt parte, o valoare "*M+ reprezint timpul scurs =iat de ce domeniul este at-t de
mare si de ce sunt permise %i valorile negative>! Partea din e.tremitatea dreapt a valorii este considerat ca
indic-nd secunde deci, dac insera&i o valoare de or 6scurt1 =incomplet de#init>, precum 11<J201 ,ntr/o
coloan "*M+, valoarea stocat este 100J1<J201, ceea ce este interpretat su$!#orma 61< minute, 20 de secunde1!
Pute&i #olosi coloanele de tip "*M+ pentru a reprezenta ora din zi dac dori&i, dar nu uita&i de aceast regul de
conversie dac dori&i s evita&i pro$lemele! Pentru a insera valoarea 61< ore, 20 de minute1, tre$uie s o
speci#ica&i su$ #orma 1 1<J20J001!
1<9 Partea l Utilizarea general a sistemului MySQL "ipul de coloan "*M+S"(MP
Coloanele "*M+S"(MP reprezint valorile ,n #ormatul ((((LLPP??mmss, cu un domeniu cuprins ,ntre
1:D00101000000 %i undeva ,n anul <02D! 4omeniul este legat de ora U*B, unde prima zi din 1:D0 este 6ziua
zero1, cunoscut %i su$ numele de 6epoc1, ,nceputul lui 1:D0 determin e.tremitatea in#erioar a domeniului
"*M+S"(MP! +.tremitatea superioar a domeniului corespunde limitei de 8 octe&i a orei U*B, care poate
reprezenta valori ,iV anul <02D;!
"ipul "*M+S"(MP are aceast denumire =amprent de timp / !"!> deoarece are proprietatea special de a
,nregistra momentul crerii sau al modi#icrii unei ,nregistrri! 4ac insera&i o valoare ULL ,ntr/o coloan
"*M+S"(MP, valoarea coloanei devine automat aceea a datei si orei curente! (cest lucru se ,nt-mpl si atunci
c-nd crea&i sau actualiza&i un r-nd, dar nu atri$ui&i coloanei nici o valoare e.plicit! "otu%i, numai prima coloan
"*M+S"(MP dintr/un r-nd este tratat ,n acest mod %i, c?iar %i pentru prima coloan, pute&i anula aplicarea
amprentei de timp prin inser&ia ,n coloan a unei date %i a unei ore e.plicite ,n locul valorii ULL!
4eclara&ia unei coloane "*M+S"(MP poate include o speci#ica&ie pentru o l&ime ma.im de a#i%are M! "a$elul
<!1< a#i%eaz #ormatele de a#i%are pentru valorile permise ale lui M! 4ac M este omis dintr/o declara&ie
"*M+S"(MP sau are o valoare egal cu 3 sau mai mare dec-t 18, coloana este tratat ca "*M+S"(MP=18>!
7alorile impare ale lui M cuprinse ,n intervalul 1/12 sunt asimilate urmtorului numr par imediat superior!
"a$elul <!1< Formate de a#i%are pentru valorile "*M+S"(MP Speci#ica&ia tipului
"*M+S"(MP=18> "*M+S"(MP=1<> "*M+S"(MP=10> "*M+S"(MP=9> "*M+S"(MP=;> "*M+S"(MP=8>
"*M+S"(MP=<>
Formatul de a#i%are
((((LLPP??mmss
((((LLPP??mm
((LLPP??mm
((((LLPP
((LLPP
((LL
((
L&imea de a#i%are pentru coloanele "*M+S"(MP nu are nici o legtur cu dimensiunea spa&iului de stocare sau
cu valorile stocate intern! 7alorile "*M+S"(MP sunt ,ntotdeauna stocate su$ #orm de 8 octe&i %i sunt #olosite ,n
calcule cu precizie complet de 18 ci#re, l indi#erent de l&imea de a#i%are! Pentru a vedea acest lucru, s
presupunem ca declara&i un ta$el dup cum urmeaz, dup care insera&i c-teva r-nduri ,n ta$el %i le regsi&iJ
; Limita superioar a valorilor "*M+S"(MP va cre%te pe msur ce sistemele de operare vor #i modi#i/ S cate
pentru a e.tinde limita superioar a valorilor orei U*B! (cesta este un aspect care tre$uie a$ordat la nivelul
$i$liotecii de sistem! MySQL va e.ploata aceste modi#icri pe msur ce acestea sunt e#ectuate! / !(!
Capitolul < Lucrul cu date ,n MySQL %i SQL 1<:
C)+("+ "(5L+ ta$elulAneu
ts "*M+S"(MP=9>, i *"
*S+)" *"3 ta$elulAneu 7(LU+S=1:::09011<0000,2> *S+)" *"3 ta$elulAneu
7(LU+S=1:::09011<0001,<> *S+)" *"3 ta$elulAneu 7(LU+S=1:::09011<000<,1>
*S+)" *"3 ta$elulAneu 7(LU+S=1:::09011<0002,0> S+L+C" d F)3M ta$elulAneu 3)4+) 5O ts, i
4atele de ie%ire ale instruc&iunii S+L+C" se prezint ast#elJ
,n aparen&, r-ndurile sunt stocate ,ntr/o ordine gre%it / valorile din prima coloan sunt toate identice, deci se
pare c sortarea ar tre$ui s aranAeze r-ndurile ,n con#ormitate cu valorile din a doua coloan! (cest rezultat
aparent anormal se datoreaz #aptului c MySQL sorteaz ,n #unc&ie de valorile complete, cu 18 ci#re, inserate ,n
coloana "*M+S"(MP!
MySQL nu are nici un tip de coloane care s primeasc data %i ora crerii ,nregistrrii %i care s rm-n imua$il
dup aceea! 4ac dori&i s realiza&i acest lucru, pute&i proceda ,n dou moduriJ
Folosi&i o coloana "*M+S"(MP! C-nd ,nregistrarea este creat pentru prima dat, atri$ui&i coloanei valoarea
ULL pentru a o ini&ializa cu valoarea datei si a orei curenteJ
*S+)" *"3 numeNta$el =tsNcol, !!!> 7(LU+S=ULL, !!!> 4e #iecare dat c-nd actualiza&i ,nregistrarea la o
dat ulterioar, atri$ui&i ,n mod e.plicit coloanei valoarea pe care o are deAa! Prin atri$uirea unei valori e.plicite
se contracareaz mecanismul de aplicare a amprentei de timp, deoarece ,mpiedic actualizarea automat a valorii
coloaneiJ
UP4("+ numeNta$el S+" tsNcolbtsNcol U'+)+ !!!
Folosi&i o coloan 4("+"*M+! C-nd crea&i o ,nregistrare, ini&ializa&i coloana la valoarea 3U=>J
*S+)" *"3 numeNta$el =dtNcol, !!!> 7(LU+S=3U=>, !!!> La #iecare actualizare ulterioar a ,nregistrrii,
lsa&i coloana nemodi#icatJ
UP4("+ nutneNta$el S+" Md orice * (F()( 4+ coloana dtNcol dM U'+)+ !!! 4ac dori&i s #olosi&i coloanele
"*M+S"(MP pentru a pstra at-t o valoare a orei crerii, c-t %i a orei ultimei modi#icri, puteri #ace aceasta
#olosind o coloan "*M+S"(MP pentru valoarea orei modi#icrii, respectiv o alt coloan "*M+S"(MP pentru
valoarea orei crerii! 7eri#ica&i ca ora modi#icrii s #ie inclus ,n prima coloan "*M+S"(MP, ast#el ,nc-t s #ie
con#igurat c-nd ,nregistrarea este creat sau modi#icat! Face&i din coloana cu ora crerii cea de/a doua coloan
"*M+S"(MP si ini&ializati/o la valoarea 3U=> atunci c-nd crea&i ,nregistrri noi! (st#el, valoarea sa va
re#lecta momentul crerii ,nregistrrii %i nu se va modi#ica ulterior!
vKtt`,
! #i#1
120 Partea l Utilizarea general a sistemului MySQL "ipul de coloan O+()
O+() este un tip de coloan pe un octet #olosit pentru reprezentarea e#icient a valorilor anilor! 4omeniul de
valori este cuprins ,ntre 1:01 %i <1@@! Pute&i #olosi tipul O+() atunci c-nd dori&i s stoca&i in#orma&ii despre
date calendaristice, dar ave&i nevoie numai de an, cum ar #i anul na%terii, anul alegerii ,n #unc&ia de pre%edinte si
altele! C-nd nu ave&i nevoie de o valoare de tip dat complet, O+() este mult mai e#icient din punctul de
vedere al spa&iului utilizat dec-t alte tipuri de date!
4eclara&ia unei coloane O+() poate include o speci#icare a l&imii de a#i%are M, care poate #i 8 sau <! 4ac M
este omis dintr/o declara&ie de tip O+(), valoarea presta$ilit este 8!
"*O*" are aceea%i dimensiune a spa&iului de stocare ca si O+() =un octet>, dar nu %i acela%i domeniu! Pentru
a acoperi aceea%i perioad de timp ca %i O+() #olosind un tip ,ntreg, ave&i nevoie de un SM(LL*", care
necesit o cantitate du$l de spa&iu! 4ac intervalul de timp ,n ani pe care tre$uie s/1 reprezenta&i coincide cu
domeniul tipului O+(), cel din urm #olose%te spa&iul ,ntr/un mod mai e#icient dec-t SM(LL*"! Un alt
avantaA al coloanei O+() #a& de o coloan cu valori ,ntregi este acela c MySQL va conveni valorile din dou
ci#re ,n valori cu patru ci#re, #olosind regulile o$i%nuite de 6g?icire1 a anului din MySQL! 4e e.emplu, :D %i 18
devin 1::D, respectiv <018! "otu%i, re&ine&i c inser&ia valorii numerice 00 va avea ca rezultat stocarea valorii
0000, nu a valprii <000! 4ac dori&i ca o valoare zero s #ie convertit la <000, tre$uie s o speci#ica&i su$ #orm
de%irJ 1001!
(tri$utele coloanelor de tip dat %i or
u e.ist nici un atri$ut speci#ic coloanelor de tip dat %i or! (tri$utele generale ULL sau S 3" ULL pot #i
speci#icate pentru oricare dintre tipurile dat %i or! 4ac nu speci#ica&i niciAA unul din aceste atri$ute, ULL este
cel presta$ilit! 4e asemenea, pute&i speci#ica o valoare^ presta$ilit #olosind atri$utul 4+F(UL"! 4ac nu
speci#ica&i o valoare presta$ilit, o aseme/^ nea valoare va #i aleas automat! 7aloarea presta$ilit este ULL
pentru coloanele care pot con&ine ULL, ,n caz contrar, valoarea presta$ilit pentru tipul respectiv este 6zero1!
Lucrul cu coloane de tip dat %i or
MySQL ,ncearc s interpreteze valorile de tip dat %i or ,ntr/o varietate de #ormatei 7alorile 4("+ pot #i
speci#icate ,n oricare din urmtoarele #ormate, inclusiv #ormele %ir J numerice! "a$elul <!12 prezint #ormatele
permise pentru #iecare dintre tipurile dat %i or
"a$elul <!12 Formate de intrare pentru coloanele de tip dat si or "ip
4("+"*M+, "*M+S"(MP
Formate permise
((((/LL/PP ??JmmJss1 1((/LL/PP ??JmmJss1 1((((LLPP??mmss1 1 ((LLPP??mmss1
((((LLPP??mmss ((LLPP??mmss
Capitolul < Lucrul cu date ,n MySQL %i SQL 121
"ip
4("+
"*M+
O+()
Formate permise
1((((/Ll/PP1
1((/LL/PP1
1((((LLPP1
1((LLPP1
((((LLPP
((LLPP
1??JmmJss1
1??mmss1
??mmss
11((1
((((
((
Formatele cu dou ci#re pentru valoarea anului sunt interpretate #olosind regulile descrise ,n sec&iunea
6*nterpretarea valorilor am$igui ale anilor1! Pentru #ormate de tip %ir care includ caractere de delimitare, nu
tre$uie s #olosi&i cratimele pentru date, respectiv caracterul dou puncte pentru ore! Ca delimitator poate #i
#olosit orice semn de punctua&ie! *nterpretarea valorilor depinde de conte.t, nu de delimitator! 4e e.emplu, de%i
orele sunt speci#icate de o$icei #olosind delimitatorul dou puncte, MySQL nu va interpreta o valoare care
con&ine acest caracter ca o or ,ntr/un conte.t unde se a%teapt o dat! ,n plus, pentru #ormatele de tip %ir care
includ delimitatori, nu tre$uie s speci#ica&i dou ci#re pentru valorile lunilor, zilelor, orelor, minutelor sau
secundelor care sunt mai mici dec-t 10! Urmtoarele #ormate sunt toate ec?ivalente ,ntre eleJ
1<01</0</02 0@J08J0:1 K
1<01</</02 0@J08J0:1
1<01</</2 0@J08J0:1
1<01</</2 @J08J0:1
1<01</</2 @J8J0:1
1<01</</2 @J8J:1
3$serva&i c valorile cu zerouri ini&iale pot #i interpretate di#erit, ,n #unc&ie de #aptul dac sunt speci#icate ca
%iruri sau ca numere! Eirul 1001<211 va #i vzut ca o valoare cu %ase ci#re si va #i interpretat su$ #orma 1<000/1</
211 pentru o coloan 4("+, respectiv ca 1 <000 /1< / 21 00J00J001 pentru o coloan 4("+"*M+! Pe de alt
parte, numrul 001<21 va #i asimilat cu 1<21 dup ce a 6trecut1 prin analizor, moment dup care interpretarea
devine pro$lematic! (ceasta este o situa&ie unde cel mai $ine este s #urniza&i o valoare de tip %ir sau s #olosi&i
o valoare complet determinat ,n cazul ,n care utiliza&i numere =adic <0001<21 pentru 4("+, respectiv
<0001<210000 pentru 4("+"*M+>!
,n general, pute&i atri$ui la discre&ie valori ,ntre tipurile 4("+, 4("+"*M+ si "*M+S"(MP,
de%i tre$uie s &ine&i cont de anumite restric&iiJ
4ac repartiza&i o valoare 4("+"*M+ sau "*M+S"(MP ,ntr/o coloan 4("+, partea de or
este eliminat!
12< Partea l Utilizarea general a sistemului MySQL
4ac repartiza&i o valoare 4("+ ,ntr/o coloan 4("+"*M+ sau "*M+S"(MP, partea de or a valorii
rezultante prime%te valoarea zero!
"ipurile respective au domenii di#erite, ,n particular, "*M+S"(MP are un domeniu mai limitat =,ntre 1:D0 si
<02D> deci, de e.emplu, nu pute&i repartiza o valoare 4("+"*M+ anterioar lui 1:D0 ,ntr/o coloan
"*M+S"(MP si s v a%tepta&i la rezultate rezona$ile! 4e asemenea, ,ntr/o coloan "*M+S"(MP nu pute&i plasa
valori din viitorul ,ndeprtat!
MySQL #urnizeaz multe #unc&ii pentru lucrul cu valorile de tip dat %i or! Pentru mai multe in#orma&ii, vezi
(ne.a C!
*nterpretarea valorilor am$igue ale anilor
Pentru toate coloanele de tip dat si or care includ o parte care con&ine anul =4("+, 4("+"*M+,
"*M+S"(MP, O+()>, MySQL manipuleaz valori care con&in ani e.prima&i prin dou ci#re convertind aceste
valori ,n ani e.prima&i cu patru ci#re! (ceast conversie se produce ,n con#ormitate cu urmtoarele reguliDJ
7alorile anilor cuprinse ,ntre 00 %i ;: se trans#orm ,n valori din intervalul <000/<0;:
7alorile anilor cuprinse ,ntre D0 si :: se trans#orm ,n valori din intervalul 1:D0/1:::
Pute&i vedea cel mai u%or e#ectul acestor reguli prin repartizarea a dou valori cu dou ci#re di#erite ,ntr/o
coloan O+() si apoi regsind rezultatele! 4e asemenea, e.emplul va scoate ,n eviden& ceva ce merit re&inutJ
mysjlV C)+("+ "(5L+ yNta$el =y O+()>0
mysjlV *S+)" *"3 yAta$el 7(LU+S=;9>,=;:>,=::>, =00>0
mysjlV S+L+C" d F)3M yNta$el0
<0;9 1:;: 1::: 0000
3$serva&i c 00 a #ost convertit ,n 0000, nu ,n <000! (ceasta deoarece 3 este o valoare a$solut corect pentru
tipul O+()0 dac insera&i un zero numeric, atunci ve&i o$&ine un^ zero numeric! Pentru a o$&ine <000, insera&i
%irul 131 sau 1001! 7 pute&i asigura MySQL 6vede1 un %ir si nu un numr prin inser&ia valorilor O+() #olosind
C3C(" =>A (ceast #unc&ie returneaz ,ntotdeauna un rezultat %ir, indi#erent dac argumentul sli este un %ir
sau un numr!
,n orice caz, re&ine&i c regulile pentru conversia anilor compu%i din dou ci#re ,n compu%i din patru ci#re asigur
numai intuirea ,n limite rezona$ile a valorii! u e.ist nici o modalitate ca MySQL s #ie sigur de semni#ica&ia
unui an e.primat prin dou ci#r%5 atunci c-nd nu se speci#ic secolul! 4ac regulile de conversie din MySQL nu
genere valorile dorite, solu&ia este evidentJ #urniza&i date #r ec?ivoc, cu ani e.prima&i prii patru ci#re!
D ,n MySQL 8!0, regulile vor su#eri o oarecare sc?im$are, prin aceea c ;: va #i convertit ,n 1:;:,J ,n <0;:, ,n
con#ormitate cu regulile speci#icate prin standardul U*B BM3pen! / !(!
Capitolul < Lucrul cu date ,n MySQL %i SQL 122
(legerea tipurilor de coloan
Sec&iunea anterioar descrie di#eritele tipuri de coloane MySQL din care pute&i alege, precum si propriet&ile
generale ale acestor tipuri, ca tipurile de valori pe care le pot con&ine, cantitatea de spa&iu de stocare pe care o pot
ocupa %i altele! 4ar cum alege&i tipurile de coloane pe care le ve&i #olosi c-nd crea&i un ta$elg (ceast sec&iune
discut despre aspectele care tre$uie avute ,n vedere pentru a v aAuta s alege&i!
Cele mai 6generale1 tipuri de coloane sunt tipurile %ir! ,n aceste coloane pute&i stoca orice, deoarece numerele si
datele pot #i reprezentate su$ #orm de %ir! 4eci, de ce n/a&i declara toate coloanele su$ #orm de %iruri %i s
termina&i povesteag S ne g-ndim la un singur e.emplu! S presupunem c ave&i valori care arat ca ni%te
numere! Le pute&i reprezenta ca numere, dar c?iar tre$uie s o #ace&ig Ce se ,nt-mpl dac proceda&i ast#elg
,n primul r-nd, pro$a$il c ve&i #olosi o cantitate mai mare de spa&iu, deoarece numerele pot #i stocate ,ntr/un
mod mult mai e#icient dec-t %irurile! 4e asemenea, ve&i remarca unele di#eren&e ,ntre rezultatele interogrilor,
datorit modalit&ilor di#erite de manipulare a %irurilor %i a numerelor! 4e e.emplu, ordinea de sortare pentru
numere nu este aceea%i ca pentru %iruri! umrul < este mai mic dec-t numrul 11, dar %irul 1<1 este, din punct
de vedere le.icogra#ic, mai mare dec-t %irul 1111! Pute&i rezolva aceast pro$lem #olosind coloana ,ntr/un
conte.t numeric, ca acestaJ S+L+C" numeNcoloana C 3 (S num!!! 3)4+) 5O num
MySQL ore 6pro$lema anului <0001g
MySQL nu are pro$lema anului <000, deoarece stoc?eaz datele intern su$ #orm de ani cu patru ci#re, dar este
rspunderea dumneavoastr s #urniza&i de la $un ,nceput date care s ai$ ca rezultat stocarea valorilor
adecvate! (devrata pro$lem cu interpretarea anilor cu dou ci#re nu este dat de MySQL, ci de dorin&a uman
de a 6o lua pe scurttur1 %i de a #urniza date ec?ivoce! 4ac dori&i s v asuma&i riscul, sunte&i li$er s o #ace&i!
+ste riscul dumneavoastr, iar regulile de determinare a anului din MySQL sunt adecvate ,n multe situa&ii! +ste
$ine s %ti&i, ,ns, c e.ist situa&ii c-nd tre$uie s introduce&i ani din patru ci#re! 4e e.emplu, pentru a introduce
datele de na%tere %i de deces ,n ta$elul pre%edinte, care con&ine pre%edin&ii americani ,ncep-nd din secolul al
B7***/lea, se impune utilizarea a patru ci#re! 7alorile din aceste coloane acoper mai multe secole, deci a lsa
MySQL s !g?iceasc1 secolul pe $aza unui an din dou ci#re este categoric o op&iune eronat!
Prin adugarea unui zero la coloan se #or&eaz o sortare numeric, dar este oare rezona$ilg ,n general, pro$a$il
c nu! ( determina MySQL s trateze coloana ca pe un numr, nu ca pe un %ir, are c-teva implica&ii importante!
Se #or&eaz o conversie %ir/numr pentru #iecare valoare din coloan, ceea ce este ine#icient! 4e asemenea,
trans#ormarea coloanei ,ntr/o coloan cu valori calculate ,mpiedic MySQL s #oloseasc un inde. pentru
coloan, ceea ce reduce %i mai mult viteza interogrii! ici una din aceste degradri ale per#orman&ei nu se va
produce dac stoca&i de la $un ,nceput valorile su$ #orm de numere! Simpla op&iune de a #olosi o reprezentare ,n
locul alteia are implica&ii pentru cerin&ele privind dimensiunea spa&iului de stocare, manipularea interogrilor %i
per#orman&ele de prelucrare!
128 Partea l Utilizarea general a sistemului MySQL
+.emplul anterior ilustreaz #aptul c la alegerea tipurilor de coloane intr ,n Aoc mai mul&i #actori! Lista
urmtoare parcurge rapid #actorii la care tre$uie s v g-ndi&i atunci c-nd selecta&i un tip pentru o coloan!
Ce tip de valori va con&ine coloanag umereg Eirurig 4ate calendaristiceg (ceasta este o ,ntre$are evident, dar
tre$uie s o pune&i! Pute&i reprezenta orice tip de valoare su$ #orm de %ir, dar, a%a cum am vzut anterior,
pro$a$il ve&i o$&ine per#orman&e superioare dac #olosi&i alte tipuri mai adecvate pentru valorile numerice! =(cest
lucru este de asemenea vala$il pentru valorile de tip dat %i or!> "otu%i, evaluarea tipului de valori cu care lucra&i
nu este ,n mod o$ligatoriu ceva $anal, mai ales dac este vor$a despre datele altcuiva! +ste deose$it de important
s ,ntre$a&i care este tipul de valori pe care ,l vor con&ine coloanele ,n cazul ,n care con#igura&i un ta$el pentru
altcineva si tre$uie s #i&i sigur c pune&i destule ,ntre$ri cu scopul de a primi su#iciente in#orma&ii pentru a lua
o decizie inspirat!
7alorile dumneavoastr se gsesc ,ntr/un anumit domeniu particularg 4ac sunt ,ntregi, vor #i ,ntotdeauna
di#erite de zerog 4ac da, pute&i #olosi US*I+4! 4ac sunt %iruri, vor #i ,ntotdeauna selectate dintr/un set
#i.at de valorig 4ac da, ve&i gsi util tipul +UM sau S+"!
+.ist un compromis ,ntre domeniul unui tip %i cantitatea de spa&iu de stocare pe care o #olose%te! C-t de 6mare1
este tipul de care ave&i nevoieg Pentru numere, pute&i alege i tipuri mici, cu un domeniu limitat de valori,
respectiv tipuri mari, care sunt, ,n esen&, A nelimitate! Pentru %iruri, le pute&i #ace scurte sau lungi %i nu ve&i alege
declara&iaR C'() =<@@> dac toate valorile pe care dori&i s le stoca&i con&in mai pu&in de l 3 caractere, i
Care sunt aspectele legate de per#orman& %i e#icien&g Unele tipuri pot #i prelucrate ^ mai e#icient dec-t altele!
3pera&iile numerice, ,n general, pot #i e#ectuate mai rapidl dec-t opera&iile cu %iruri! Eirurile scurte pot #i
comparate mai u%or dec-t %irurile lungii %i implic, de asemenea, o suprasarcin mai redus asupra discului!
Per#orman&ele sunt, mai ridicate pentru tipurile de lungime #i. dec-t pentru cele de lungime varia$il!
Cum dori&i s #ie comparate valorile dumneavoastrg Pentru %iruri, compara&iite^ pot sesiza sau nu di#eren&a
,ntre maAuscule %i minuscule! (ici, op&iunile dumneavoasM tr mai pot a#ecta %i sortarea, care este $azat pe
compara&ii!
*nten&iona&i s inde.a&i o coloang 4ac da, acest lucru in#luen&eaz op&iunea dum/&l neavoastr privind tipul
coloanei, deoarece unele versiuni de MySQL nu v permit si inde.a&i anumite tipuri, precum 5L35 %i "+B"! 4e
asemenea, unele versiuni de MyS= impun ca o coloan inde.at s #ie declarat ca 3" ULL, ceea ce
a#ecteaz posi$ilitatea dumneavoastr de a #olosi valori ULL!
(cum, s lum ,n considerare #iecare dintre aceste pro$leme ,n detaliu! 4ar, ,nainte de f trece la #apte, permite&i/
mi un punct de vedereJ dori&i s #ace&i cele mai $une alegeri posi# $ile privind tipurile de coloane atunci c-nd
crea&i un ta$el, dar, dac #ace&i o alegere ca nu se dovede%te a #i optim, nu este s#-r%itul lumii! Pute&i #olosi
(L"+) "(5L+ pentru l ,nlocui tipul cu unul mai $un, ceea ce se poate reduce la ,nlocuirea unui SM(LL*" cu
M+4*UM*" dup ce a&i descoperit c datele dumneavoastr con&in valori mai mari de cele la care v/a&i g-ndit
ini&ial! (ceast opera&ie poate #i, ,ns, complicat, cum ar ,nlocuirea unui C'() cu un +UM cu un set $ine
precizat de valori permise, ,n MySQL 2!J
Capitolul < Lucrul cu date ,n MySQL %i SQL 12@
%i versiunile ulterioare, pute&i #olosi P)3C+4U)+ ((LOS+=> pentru a o$&ine in#orma&ii despre coloanele
ta$elului dumneavoastr, cum ar #i valorile minime si ma.ime, precum %i un tip optim propus care s acopere
domeniul de valori dintr/o coloan! (ceast #unc&ie v poate aAuta s concluziona&i c se poate #olosi un tip mai
mic, care poate ,m$unt&i per#orman&ele interogrilor care implic ta$elul si care reduce cantitatea de spa&iu
necesar pentru stocarea ta$elului!
Ce tip de valori va con&ine coloanag
Primul lucru la care v g-ndi&i atunci c-nd ,ncerca&i s v decide&i asupra unui tip de coloan este genul de valori
pentru care va #i #olosit coloana, deoarece acesta este #aptul cu implica&iile cele mai evidente pentru tipul pe
care ,l alege&i, ,n general, proceda&i ,ntr/un mod previzi$ilJ stoca&i numerele ,n coloane numerice, %irurile ,n
coloanele %ir, respectiv datele si orele ,n coloane de tip dat si or! 4ac numerele dumneavoastr au o parte
#rac&ionar, ve&i #olosi un tip de coloan cu virgul mo$il ,n locul unui tip ,ntreg %i a%a mai departe! Uneori
e.ist %i e.cep&ii! (ici, principiul este c tre$uie s ,n&elege&i natura datelor dumneavoastr, pentru a #i capa$il s
alege&i tipul de coloan ,ntr/o manier 6in#ormat1! 4ac v ve&i stoca propriile date, pro$a$il c %ti&i $ine cum
s le caracteriza&i! Pe de alt parte, dac alte persoane v solicit s le con#igura&i un ta$el, uneori datele
pro$lemei se sc?im$! S/ar putea s nu a#la&i prea u%or care sunt elementele pe care le #olosi&i! u uita&i s pune&i
su#iciente ,ntre$ri pentru a a#la tipurile de valori pe care tre$uie s le con&in ta$elul!
S presupunem c vi se spune c o coloan tre$uie s stoc?eze 6cantitatea de precipita&ii1! +ste vor$a de un
numrg Sau este 6,n cea mai mare parte1 numeric / adic de regul, dar nu ,ntotdeauna, este codi#icat su$ #orma
unui numrg 4e e.emplu, c-nd urmri&i %tirile la televizor, $uletinul meteorologic include, ,n general, o msur a
precipita&iilor! Uneori este vor$a de un numr =de e.emplu 6; mm de ploaie1>, dar alteori este o 6urm1 de pre/
cipita&ii, ceea ce ,nseamn 6#oarte pu&in1! "oate $une %i #rumoase ,n ceea ce prive%te $uletinul meteorologic, dar
ce ,nseamn asta pentru stocarea ,ntr/o $az de dateg Fie tre$uie s cuanti#ica&i no&iunea de 6urm1 su$ #orma
unui numr, ast#el ,nc-t s pute&i #olosi o coloan numeric pentru a ,nregistra cantit&ile de precipita&ii, #ie
tre$uie s #olosi&i un %ir, ast#el ,nc-t s pute&i ,nregistra cuv-ntul 6urm1! (lternativ, pute&i veni cu un aranAament
mai complicat, #olosind o coloan numeric %i o coloan %ir, caz ,n care completa&i o coloan si insera&i ,n
cealalt valoarea ULL! +ste evident c dori&i s evita&i acea op&iune, dac este posi$il0 ta$elul ar deveni mai
di#icil de ,n&eles si ,ngreuneaz semni#icativ scrierea interogrilor!
Pro$a$il c eu as ,ncerca s stoc?ez toate r-ndurile ,n #ormat numeric %i apoi s le convertesc con#orm
necesit&ilor de a#i%are! 4e e.emplu, dac orice cantitate de precipita&ii mai mic de 0,<@ mm, dar di#erit de
zero, este considerat o cantitate de tip 6urm1, pute&i a#i%a valori din coloan ast#elJ
S+L+C" *F=precipV0 (4 precip\!<@, 1urma1 !precip> F)3M !!!
,_!,/dK
1 L_0
13g
12; Partea l Utilizarea general a sistemului MySQL
Pentru calcule monetare, lucra&i cu valori care con&in dolari %i cen&i9! (cestea par a #i valori cu virgul mo$il,
dar FL3(" %i 43U5L+ sunt supuse la erori prin rotunAire %i pot #i inadecvate, cu e.cep&ia ,nregistrrilor ,n care
ave&i nevoie numai de o precizie apro.imativ! 4eoarece oamenii sunt destul de sensi$ili c-nd este vor$a de
$anii lor, pro$a$il c ve&i avea nevoie de un tip de coloane care s permit o precizie per#ect! (ve&i la dispozi&ie
c-teva op&iuniJ
Pute&i reprezenta sumele de $ani ca un tip 4+C*M(L=M, <>, aleg-nd M ca l&ime ma.im adecvat pentru
domeniul de valori de care ave&i nevoie! (st#el, o$&ine&i valori cu virgul mo$il cu precizie de dou ci#re dup
virgul! (vantaAul tipului 4+C*M(L este acela c valorile sunt reprezentate su$ #orm de %iruri %i nu sunt supuse
erorilor prin rotunAire! 4ezavantaAul este c opera&iile cu %iruri sunt mai pu&in e#iciente dec-t cele cu valori
reprezentate intern su$ #orm de numere!
Pute&i reprezenta intern toate valorile monetare su$ #orm de cen&i, #olosind un tip ,ntreg! (vantaAul este c
toate calculele sunt e#ectuate intern #olosind ,ntregi, ceea ce determin o mare vitez de calcul! 4ezavantaAul este
c va tre$ui s converti&i valorile la intrare sau ie%ire, prin ,nmul&ire sau ,mpr&ire la 100!
Unele valori sunt ,n mod evident numerice, dar tre$uie s determina&i dac ve&i #olosi un tip ,ntreg sau cu virgul
mo$il! "re$uie s ,ntre$a&i care sunt unit&ile de msur %i precizia cerut! Precizia dat de unit&ile ,ntregi este
su#icient sau tre$uie s reprezen/d ta&i %i unit&i #rac&ionareg (ceast ,ntre$are v poate aAuta s #ace&i di#eren&a
dintre A tipurile de coloan ,ntregi %i cele cu virgul mo$il! 4e e.emplu, dac reprezenta&ii greut&i, pute&i #olosi
o coloan cu valori ,ntregi dac ,nregistra&i valorile p-n la cea mai l apropiat cantitate e.primat ,n Gilograme!
7e&i #olosi o coloan cu virgul mo$il daci l dori&i s ,nregistra&i unit&i #rac&ionare, ,n unele situa&ii, pute&i
#olosi c?iar %i c-mpuri A multiple, de e.emplu dac dori&i s ,nregistra&i greutatea ,n Gilograme si grame,
,nl&imea este un alt tip numeric de in#orma&ii pentru care e.ist numeroase posi$ilit&ii de reprezentareJ
SS
Un %ir de genul 1;/<1 pentru o valoare de genul 6; picioare %i < inc?:1! (ceasti#A op&iune are avantaAul de a
avea o #orm simplu de e.aminat side ,n&eles =categoric ma,^ simpl dec-t 6D8 inc?1>, dar aceast categorie de
valori este mai di#icil de utilizat pent opera&ii matematice, precum ,nsumarea sau calculul mediei!
Un c-mp numeric pentru valorile e.primate ,n picioare %i altul pentru valoriUA e.primate ,n inc?! (ceasta este
o #orm ceva mai u%or de ,ntre$uin&at pentru
&iile matematice, dar dou c-mpuri sunt mai di#icil de #olosit dec-t unul singur!
Un c-mp numeric reprezent-nd valorile ,n inc?! +ste cel mai u%or de utilizat ctre o $az de date, dar cel mai
greu de ,n&eles pentru oameni! 4ar nu uita&i c nu i $uie s prezenta&i valorile ,n #ormatul pe care ,l #olosi&i
pentru a lucra cu ele! Pute^^ re#ormata valorile pentru o a#i%are mai semni#icativ #olosind numeroasele #unc&ii
9 (m pre#erat s pstrm te.tul original, deoarece 6marea1 noastr moned na&ional a aAuns at-t \ mic, ,nc-t
vor$ind despre lei %i $ani =adic a suta parte dintr/un leu> ,n momentul actual riscm i nu producem dec-t r-sul
=amar sau ironic> al cititorului rom-n!!! k !"!
: *n sistemul metric anglo/sa.on, unit&i de msur a lungimii, l picior b 22 cm, l inc? b <,@8 cm! / !
Capitolul < Lucrul cu date ,n MySQL %i SQL 12D
sistemului MySQL! (ceasta ,nseamn c op&iunea de #a& este cea mai $un modalitate de reprezentare a
,nl&imii!
4ac tre$uie s stoca&i in#orma&ii despre date calendaristice, valorile respective includ %i orag Cu alte cuvinte, va
#i vreodat nevoie s includ %i orag MySQL nu #urnizeaz un tip de date care s ai$ o parte op&ional pentru
orJ 4("+ nu are niciodat o or, iar 4("+ /"*M+ tre$uie s ai$ o or! 4ac ora este ,ntr/adevr op&ional,
#olosi&i o coloan 4("+ pentru a ,nregistra data, respectiv o coloan "*M+ separat pentru a include ora! (poi
permite&i coloanei "*M+ s ia valoarea ULL si interpreta&i aceast valoare ca 6#r or1J C)+("+ "(5+L
ta$elul meu
data 4("+ 3" ULL,
ora "*M+ ULL >
Un tip de situa&ie c-nd este deose$it de important s determina&i dac ave&i sau nu nevoie de o valoare a orei se
produce atunci c-nd uni&i dou ta$ele cu o rela&ie de tip master/detaliu, ta$ele care sunt 6legate1 ,n #unc&ie de
in#orma&iile legate de dat!
S presupunem c sunte&i coordonatorul unei activit&i de cercetare care implic su$iec&i ce intr ,n $iroul
dumneavoastr pentru a #i testa&i! 4up un set ini&ial standard de teste, pute&i e#ectua mai multe teste
suplimentare ,n aceea%i zi, unde op&iunea testelor variaz ,n #unc&ie de rezultatele testelor ini&iale! Pute&i
reprezenta aceste in#orma&ii #olosind o rela&ie master/detaliu, ,n care in#orma&iile de identi#icare a su$iectului %i
testele standard ini&iale sunt stocate ,ntr/o ,nregistrare ma%ter, iar toate testele suplimentare sunt stocate su$
#orm de r-nduri ,ntr/un ta$el secundar cu detalii! (poi, corela&i cele dou ta$ele ,n #unc&ie de identi#icatorul
su$iectului %i data la care au avut loc testele!
,ntre$area la care tre$uie s rspunde&i ,n aceast situa&ie este dac pute&i #olosi numai data sau dac v tre$uie
at-t data, c-t %i ora! (cest lucru depinde de #aptul dac un su$iect poate parcurge procedura de testare de mai
multe ori, pe durata aceleia%i zile! 4ac da, ,nregistra&i ora =de e.emplu ora la care ,ncepe procedura> #olosind #ie
o coloan 4("+"*M+, #ie coloane 4("+ %i "*M+ separate, care tre$uie completate am-ndou! Fr valoarea
orei, nu ve&i putea asocia ,nregistrrile detaliu ale unui su$iect cu ,nregistrrile ma%ter adecvate dac su$iectul a
#ost testat de dou ori ,ntr/o zi!
(m auzit oameni spun-ndJ 6/am nevoie de or0 nu voi testa niciodat un su$iect de dou ori ,n aceea%i zi!1
Uneori au dreptate, dar i/am vzut pe o parte din aceia%i oameni aAung-nd ulterior s se ,ntre$e cum pot preveni
asocierea ,nregistrrilor detaliu cu o ,nregistrare ma%ter gre%it, dup ce au introdus date pentru su$iec&i care au
#ost testa&i de mai multe ori ,ntr/o zi! Scuze, dar atunci e prea t-rziuL
Uneori pute&i rezolva aceast pro$lem prin inser&iaMVortMdrtYm ,n ta$ele a unei coloane "*M+! 4in pcate,
,nregistrrile e.istente sunt di#icil de remediat, cu e.cep&ia situa&iilor c-nd ave&i o surs independent de date,
cum sunt ,nregistrrile originale scrise! (lt#el, nu ave&i nici o modalitate de a 6clari#ica misterul1 ,nregistrrilor
detaliu am$igui, pentru a le asocia cu ,nregistrarea ma%ter adecvat! C?iar dac ave&i o surs independent de
in#orma&ii, aceasta este o opera&ie ,ncurcat %i poate cauza pro$leme aplica&iilor pe care le/a&i scris deAa cu scopul
de a utiliza ta$elele! Cel mai $ine este s e.plica&i pro$lema
129 Partea l Utilizarea general a sistemului MySQL
posesorilor ta$elelor %i s v asigura&i c dispune&i de o $un caracterizare a valorilor datelor ,nainte de a le crea
ta$elele!
Uneori pute&i avea date incomplete, lucru ce poate in#luen&a op&iunea dumneavoastr privind tipurile de coloane!
4e e.emplu, aduna&i date de na%tere si deces pentru cercetri de natur genealogic, iar uneori tot ce pute&i a#la
este anul ,n care cineva s/a nscut sau a decedat, nu %i data e.act! 4ac #olosi&i o coloan 4("+, nu pute&i
introduce o dat dec-t dac dispune&i de toate elementele acesteia! 4ac dori&i s pute&i ,nregistra in#orma&iile pe
care le ave&i, oricare ar #i acestea, c?iar dac sunt incomplete, s/ar putea s #i&i o$ligat s #olosi&i c-mpuri
separate pentru an, lun %i zi! (poi pute&i introduce pr&ile de in#orma&ii pe care le ave&i si insera&i valoarea
ULL pentru celelalte in#orma&ii, ,n MySQL 2!<2 si versiunile ulterioare e.ist si o alt posi$ilitate, care permite
pr&ilor care con&in ziua, respectiv luna %i data, s ia valoarea 0! (semenea date 6neclare1 pot #i #olosite pentru a
reprezenta valori de date incomplete!
7alorile dumneavoastr se ,ncadreaz ,ntr/un anumit domeniug
4ac v/a&i oprit asupra unei categorii generale din care s selecta&i un tip pentru o coloan, sta$ilirea domeniului
de valori pe care dori&i s/1 reprezenta&i v va aAuta s reduce&i plaAa de op&iuni la un anumit tip din cadrul acelei
categorii! S presupunem c dori&i s stoca&i valori ,ntregi! 4omeniul valorilor dumneavoastr determin tipurile
pe care le pute&i #olosi! 4ac ave&i nevoie de valori ,n domeniul 0/1000, pute&i #olosi orice tip cuprins ,ntre
SM(LL*" %i 5*I*"! 4ac valorile dumneavoastr aAung p-n la dou milioane, nu pute&i #olosi SM(LL*",
iar op&iunile dumneavoastr variaz de la M+4*UM*" la 5*I*"! (poi, tre$uie s selecta&i un tip dintre
posi$ilit&ile e.istente!
Pute&i, desigur, s #olosi&i pur si simplu cel mai mare tip pentru categoria de valoare pe care dori&i s o stoca&i
=5*I*" pentru e.emplele din paragra#ul anterior>, ,n general, totu%i, tre$uie s #olosi&i cel mai mic tip care este
su#icient de mare pentru inten&iile0 dumneavoastr! Proced-nd ast#el, ve&i reduce la minimum cantitatea de spa&iu
#olosit de ta$elele dumneavoastr, iar acestea v vor o#eri per#orman&e superioare, deoarece coloanele mai mici
pot #i, de o$icei, prelucrate mai rapid dec-t coloanele mai mari!
4ac nu cunoa%te&i domeniul de valori pe care va tre$ui s/1 pute&i reprezenta, tre$uie0 s v #olosi&i intui&ia sau
s utiliza&i 5*I*" pentru a lua ,n calcul cel mai ru caz cuA putin&! =)e&ine&i c, dac v da&i cu prerea si
#olosi&i un tip care se dovede%te a #i prea^ mic, nu este totul pierdut0 pute&i #olosi mai t-rziu (L"+) "(5L+
pentru a #ace coloana m0 6,ncptoare1!>
,n capitolul l, am creat un ta$el puncte pentru proiectul de eviden& a rezultatelor %co care con&inea o coloan
puncte pentru ,nregistrarea punctaAelor o$&inute la c?estionare %i teste! "a$elul #usese creat #olosind * " pentru a
pstra simplitatea e.punerii, dar pute&i vedea c, dac punctaAele se a#l ,n domeniul 0/100, o op&iune mai $un
ar #i "*O* US*I+4, deoarece ar #olosi un spa&iu de stocare mai redus!
4omeniul de valori din datele dumneavoastr in#luen&eaz de asemenea atri$utele pe cai#e le pute&i #olosi pentru
tipul coloanei dumneavoastr! 4ac valorile nu sunt niciodat in gative, pute&i #olosi US*I+40 ,n caz contrar,
nu pute&i!
Capitolul < Lucrul cu date ,n MySQL %i SQL 12:
"ipurile %ir nu au un 6domeniu1 ,n sensul domeniului coloanelor numerice, dar ele au o lungime, iar lungimea
ma.im de care ave&i nevoie a#ecteaz tipurile de coloane pe care le pute&i #olosi! 4ac %irurile dumneavoastr
sunt mai scurte de <@; caractere, pute&i #olosi C'(), 7()C'(), "*O"+B" sau "*O5L35! 4ac ave&i
nevoie de %iruri mai lungi, pute&i #olosi un tip "+B" sau 5L35, dar asta ,nseamn c C'() si 7()C'() nu
mai constituie op&iuni via$ile pentru dumneavoastr!
Pentru coloanele %ir pe care le ve&i #olosi pentru a reprezenta un set #i. de valori, pute&i lua ,n considerare
utilizarea unui tip de coloane +UM sau S+"! (cestea pot constitui op&iuni utile, deoa!ece sunt reprezentate
intern su$ #orm de numere! 3pera&iile cu aceste tipuri sunt e#ecoiate numeric, deci sunt mai e#iciente dec-t alte
tipuri de %iruri! 4e asemenea, pot #i mai compacte dec-t alte tipuri de coloane %ir, ceea ce determin economii de
spa&iu!
C-nd caracteriza&i domeniul de valori cu care tre$uie s lucra&i, termenii cei mai inspira&i sunt 6,ntotdeauna1 si
6niciodat1 =de e.emplu 6,ntotdeauna mai mic dec-t 10001 sau 6niciodat negativ1>, deoarece v aAut s
reduce&i mai mult op&iunile privind tipurile de coloane! 4ar pzi&i/v s #olosi&i ace%ti termeni atunci c-nd nu
sunt pe deplin Austi#ica&i! Fi&i atent mai ales c-nd v consulta&i cu alte persoane cu privire la datele lor si
respectivii ,ncep s v $om$ardeze cu ace%ti doi termeni! C-nd omul zice 6,ntotdeauna1 sau 6niciodat1,
asigura&i/v c vor$e%te serios! Uneori oamenii spun c datele lor au ,ntotdeauna o anumit caracteristic, pe
c-nd ,n realitate vor s spun 6aproape ,ntotdeauna1!
4e e.emplu, s presupunem c proiecta&i un ta$el pentru anumite persoane si c acestea v spunJ 6)ezultatele la
test sunt ,ntotdeauna cuprinse ,ntre 3 %i 100!1 5az-ndu/v pe aceast a#irma&ie, alege&i tipul "*O*" %i ,i da&i
atri$utul US*I+4, deoarece valorile sunt ,ntotdeauna di#erite de zero! (poi, descoperi&i c persoanele care
codi#ic datele pentru introducerea ,n $aza de date #olosesc uneori /l pentru a semnala c un elev a lipsit pe
motiv de $oal! Mi s #ieL P/asta nu v/au spus/o! Poate #i accepta$il s #olosi&i ULL pentru a reprezenta
asemenea valori dar, dac nu se poate, va tre$ui s ,nregistra&i un /l, dup care nu mai pute&i #olosi o coloan
US*I+4! =Pas alergtor, direc&ia (L"+) "(5L+L>
Uneori, deciziile despre aceste tipuri de cazuri se pot lua mai u%or pun-nd o ,ntre$are simplJ +.ist vreodat
e.cep&iig 4ac se produce vreodat un caz e.cep&ional, c?iar si o singur dat, tre$uie s #i&i pregtit! 7e&i
descoperi c persoanele care discut cu dumneavoastr despre proiectarea unei $aze de date sunt invaria$il de
prere c, dac e.cep&iile nu se produc #oarte #recvent, atunci nu conteaz! C-nd crea&i un ta$el, nu pute&i g-ndi
ast#el, ,ntre$area pe care tre$uie s o pune&i nu este c-t de #recvent se produc e.cep&ii, ci dac acestea se produc!
4ac e.cep&iile se produc, tre$uie s &ine&i cont de ele!
Care sunt pro$lemele de per#orman& %i de e#icien&g
3p&iunea dumneavoastr privind tipul de coloane poate in#luen&a per#orman&ele interogrilor ,n numeroase
moduri! 4ac ave&i ,n vedere ,ndrumrile generale discutate ,n sec&iunile anterioare, ve&i putea alege tipurile care
vor contri$ui la prelucrarea mai e#icient ,n MySQL a datelor dumneavoastr!
180 Partea l Utilizarea general a sistemului MySQL 3pera&ii numerice sau cu %iruri
3pera&iile numerice sunt, ,n general, mai rapide dec-t opera&iile cu %iruri! S ne g-ndim la opera&iile de
compara&ie! umerele pot #i comparate dintr/o singur opera&ie! Compara&iile ,ntre %iruri pot necesita mai multe
compara&ii ,ntre octe&i, care sunt cu at-t mai multe cu c-t %irurile devin mai lungi!
4ac o coloan %ir are un numr limitat de valori, #olosi&i un tip +UM sau "OP+, pentru a $ene#icia de
avantaAele opera&iilor cu numere! (ceste tipuri sunt reprezentate intern su$ #orm de numere %i pot #i prelucrate
mai e#icient!
S ne g-ndim la reprezentrile alternative pentru %iruri! Uneori, pute&i ,m$unt&i per#orman&ele prin
reprezentarea valorilor %ir su$ #orm de numere! 4e e.emplu, pentru a reprezenta numerele *P ,n nota&ia cu
puncte, cum este 1:<!1;9!0!8, a&i putea #olosi un %ir! 4ar, ca alternativ, pute&i converti numerele *P ,n ,ntregi
prin stocarea #iecrei pr&i a #ormei cu puncte ,ntr/un octet din cei patru ai unui tip *" US*I+4! (st#el, se
va economisi spa&iu %i va creste viteza de cutare! Pe de alt parte, reprezentarea numerelor *P su$ #orm de
valori * " ar #ace di#icil sta$ilirea de coresponden&e cu un model, cum sunt cele pe care le/a&i #ace dac dori&i
s cuta&i numere dintr/o su$re&ea dat! 4eci, nu pute&i &ine cont numai de aspectele legate de spa&iu0 tre$uie s
decide&i reprezentarea cea mai adecvat ,n #unc&ie de modul ,n care dori&i s utiliza&i valorile!
"ipuri mai mari sau mai mici
"ipurile mai mici pot #i prelucrate mai rapid dec-t tipurile mai mari! Unul din motive ar #i acela c ocup spa&iu
mai pu&in %i implic o suprasarcin mai redus pentru activitatea discului! Pentru %iruri, timpul de prelucrare se
a#l ,ntr/o rela&ie direct cu lungimea %irului!
,n general, ta$elele mai mici sunt mai rapide, deoarece prelucrarea interogrilor necesita mai pu&ine opera&ii de
intrare/ie%ire cu discul! Pentru coloane care #olosesc tipuri de dimensiune #i., alege&i cel mai mic tip care va
con&ine domeniul impus de valori! 4e \ e.emplu, nu #olosi&i 5*I*" dac se poate utiliza M+4*UM*"! u
#olosi&i 43U5L+ dacR ave&i nevoie numai de o precizie FL3("! Pute&i economisi spa&iu c?iar %i ,n cazul
tipurilor de dimensiune varia$il! Un 5L35 #olose%te < octe&i pentru a ,nregistra lungimea valorii, un
L3I5L35 #olose%te 8 octe&i! 4ac stoca&i valori care nu dep%esc niciodat ;80]5V R utilizarea tipului
5L35 v economise%te < octe&i pentru #iecare valoare! =Considera&ii si1 milare sunt vala$ile %i pentru tipurile
"+B", desigur!>
"ipuri de lungime #i. sau varia$il
,n general, tipurile de lungime #i. pot #i prelucrate mai rapid dec-t tipurile de lungir varia$ilJ
,n cazul coloanelor de lungime varia$il, un ta$el ,n care se e#ectueaz numeroa actualizri sau %tergeri va
prezenta un grad superior de #ragmentare, datorit dime siunilor di#erite a ,nregistrrilor! 7a tre$ui s rula&i
periodic procedura 3P"*M*< "(5L+ pentru conservarea per#orman&elor! (ceasta nu constituie o pro$lem ,n
cazd r-ndurilor de lungime #i.!
"a$elele cu r-nduri de lungime #i. sunt mai u%or de reconstruit ,n cazul 6cderii1 unui ta$el, deoarece poate #i
determinat ,nceputul #iecrei ,nregistrri! (cest lucru mi
Capitolul < Lucrul cu date ,n MySQL %i SQL 181
este vala$il la ,nregistrrile de lungime varia$il %i nu constituie o pro$lem de per#orman& ,n ceea ce prive%te
prelucrrile interogrilor, dar poate accelera ,n mod evident procesul de re#acere a ta$elului!
4ac ,n ta$elul dumneavoastr e.ist coloane cu lungime varia$il, conversia lor la coloane cu lungime #i. va
determina o ,m$unt&ire a per#orman&elor, deoarece ,nregistrrile cu lungime #i. sunt mai u%or de prelucrat,
,nainte de a ,ncerca aceast opera&ie, &ine&i cont de urmtoarele aspecteJ
Utilizarea coloanelor cu lungime #i. implic un compromis! (ceste coloane sunt mai rapide, dar ocup o
cantitate mai mare de spa&iu! Coloanele C'() =n> ocup ,ntotdeauna n octe&i pentru #iecare valoare =c?iar %i
pentru valorile vide>, deoarece valorile sunt completate cu spa&ii #inale atunci c-nd sunt stocate ,n ta$el!
Coloanele 7()C'()=n> ocup mai pu&in spa&iu, deoarece este alocat numai spa&iul necesar pentru stocarea
#iecrei valori, plus un octet ,n #iecare valoare pentru ,nregistrarea lungimii! (st#el, dac alege&i ,ntre coloanele
C'() %i 7()C'(), se #ace un compromis ,ntre timp %i spa&iu! 4ac viteza este pro$lema dumneavoastr
principal, #olosi&i coloanele C'() pentru a o$&ine avantaAele de per#orman& ale coloanelor de lungime #i.!
4ac spa&iul este la mare pre&, #olosi&i coloanele 7()C'()!
u pute&i converti o singur coloan de lungime varia$il0 tre$uie s le converti&i pe toate! 4e asemenea,
tre$uie s converti&i simultan toate coloanele de lungime varia$il #olosind o singur instruc&iune (L"+)
"(5L+0 ,n caz contrar, demersul dumneavoastr nu va avea nici un e#ect!
Uneori, nu pute&i #olosi un tip de coloan cu lungime #i., c?iar dac dori&i acest lucru! u e.ist tipuri de
lungime #i. pentru %iruri mai lungi de <@@ caractere, de e.emplu!
"ipuri inde.a$ile
*nde.urile mresc mult viteza interogrilor, deci alege&i tipuri pe care le pute&i inde.a! 7ezi sec&iunea 6(specte
legate de inde.are1 pentru mai multe in#orma&ii!
"ipuri ULL sau 3" ULL
4ac declara&i o coloan ca #iind 3" ULL, aceasta poate #i manipulat mai rapid, deoarece MySQL nu
tre$uie s veri#ice valorile coloanelor ,n timpul prelucrrii interogrilor, pentru a vedea dac acestea con&in sau
nu valoarea ULL! 4e asemenea, se economise%te un $it pentru #iecare r-nd din ta$el!
+vitarea valorii ULL ,n coloane poate simpli#ica interogrile, deoarece nu tre$uie s v mai g-ndi&i la ULL ca
la un caz special, ,n general, interogrile mai simple sunt prelucrate mai rapid!
,ndrumrile legate de per#orman& prezentate mai sus intr uneori ,n con#lict! 4e e.emplu, un r-nd cu lungime
#i. care con&ine coloane C'() va #i mai rapid dec-t un r-nd cu lungime varia$il care con&ine coloane
7()C'(), din punctul de vedere al capacit&ii sistemului MySQL de localizare a r-ndurilor! Pe de alt parte,
un asemenea r-nd va ocupa mai mult spa&iu, deci implic o activitate suplimentar a discului! 4in acest punct de
vedere, 7()C'() poate #i mai rapid! Ca regul empiric, pute&i presupune c r-ndurile cu lungime #i. vor
determina o cre%tere a per#orman&elor, c?iar dac se #olose%te o cantitate mai mare de spa&iu! Pentru o aplica&ie
deose$it de important, pute&i implementa
18< Partea l Utilizarea general a sistemului MySQL
un ta$el ,n am$ele moduri %i eventual e#ectua&i teste pentru a determina alternativa cea mai $un pentru aplica&ia
respectiv!
Cum dori&i s #ie comparate valorile dumneavoastrg
Pute&i determina compararea %i sortarea tipurilor %ir ,ntr/un mod sensi$il sau nu la di#eren&a ,ntre maAuscule si
minuscule prin modul ,n care declarau aceste tipuri! "a$elul <!18 prezint #iecare tip care nu este sensi$il la
di#eren&a ,ntre maAuscule %i minuscule, precum %i ec?ivalentul su sensi$il la o atare di#eren&! Unele tipuri
=C'(), 7()C'()> sunt $inare sau nu ,n #unc&ie de prezen&a sau a$sen&a cuv-ntului c?eie 5*()O ,n
declara&ia coloanei! Caracterul $inar al altor tipuri =5L35, "+B"> este con&inut implicit ,n numele tipului!
"a$elul <!18 Sensi$ilitatea tipurilor %ir la di#eren&a ,ntre maAuscule si minuscule
"ip non/$inar =insensi$il la di#eren&a ,ntre maAuscule %i minuscule>
C'()=M>
7()C'()=U>
"*O"+B"
"+B"
M+4*UM"+B"
L3I"+B"
"ip $inar =sensi$il la di#eren&a ,ntre maAuscule %i minuscule>
C'()=M> 5*()O
7()C'()=M> 5*()O
"*O5L35
5L35
M+4*UM5L35
L3I5L35
)e&ine&i c tipurile $inare =sensi$ile la di#eren&a ,ntre maAuscule si minuscule> di#er de omoloagele lor non/
$inare =insensi$ile la di#eren&a ,ntre maAuscule %i minuscule> numai ,n ceea ce prive%te comportarea ,n materie de
comparare %i sortare! 3rice tip %ir poate con&ine orice categorie de date! ,n particular, tipurile "+B" pot con&ine
date $inare #r nici un #el de pro$leme, ,n ciuda men&iunii 6"+B"1 din numele tipurilor de coloane!
4ac dori&i s #olosi&i o coloan at-t pentru compara&ii sensi$ile la di#eren&a ,ntre maAusr l cule %i minuscule, c-t
%i pentru compara&ii insensi$ile la o asemenea di#eren&, #olosi&i un l tip non/$inar! (poi, de #iecare dat c-nd
dori&i o compara&ie sensi$il la di#eren&a ,ntre i maAuscule %i minuscule, #olosi&i cuv-ntul c?eie 5*()O pentru a
#or&a tratarea unui %ir c pe o valoare de tip %ir $inar! 4e e.emplu, ,n cazul ,n care coloanaAnea este o coloana l
C'(), o pute&i compara ,n moduri di#eriteJ
coloanaAnea b 1(5C1 *nsensi$il la di#eren&a ,ntre maAuscule %i
5*()O coloanaAnea b 1(5C1 Sensi$il la di#eren&a ,ntre maAuscule %i minuscule V^

coloanaAnea b 5*()O 1(5C1 Sensi$il la di#eren&a ,ntre maAuscule si minuscule 1^


4ac ave&i valori %ir pe care dori&i s le sorta&i ,ntr/o anumit ordine ne/le.icogra#ic ave&i ,n vedere utilizarea
unei coloane +UM! Sortarea valorilor +UM se produce ,n con8 #ormitate cu ordinea ,n care men&iona&i
valorile din enumerare ,n declara&ia coloaneiil deci pute&i determina sortarea acestor valori ,n orice ordine dori&i!
Capitolul < Lucrul cu date ,n MySQL si SQL 182
*nten&iona&i s inde.a&i o coloang
*nde.urile permit sistemului MySQL s prelucreze interogrile mai rapid! (legerea inde.urilor este o pro$lem
discutat mai detaliat ,n capitolul 8, dar un principiu general precizeaz c acele coloane pe care le #olosi&i de
o$icei ,n clauzele U'+)+ pentru selectarea r-ndurilor constituie cele mai $une op&iuni pentru inde.are!
4ac dori&i s inde.a&i o coloan sau s o include&i ,ntr/un inde. cu mai multe coloane, e.ist restric&ii privind
tipurile pe care le pute&i alege, ,n versiunile MySQL anterioare versiunii 2!<2!<, coloanele inde.ate tre$uie
declarate 3" ULL, dup cum tipurile 5L35 si "+B" nu pot #i inde.ate! (ceste restric&ii au #ost eliminate ,n
MySQL 2!<2!<, dar, dac #olosi&i o versiune anterioar %i nu pute&i sau nu dori&i s trece&i la o versiune mai
recent, tre$uie s lucra&i cu aceste restric&ii! "otu%i, pute&i ocoli restric&iile ,n urmtoarele situa&iiJ
4ac pute&i speci#ica o anumit valoare ca #iind special, o pute&i trata ca si cum ar avea aceea%i semni#ica&ie ca
%i ULL! Pentru o coloan 4("+, pute&i desemna valoarea 10000/00/001 ca av-nd semni#ica&ia 6#r dat1, ,ntr/
o coloan de tip %ir, pute&i preciza c un %ir vid are semni#ica&ia 6valoare lips1, ,ntr/o coloan numeric, pute&i
#olosi /l dac, ,n mod normal, coloana va con&ine numai valori non/negative!
u pute&i inde.a tipurile 5L35 sau "+B", dar, dac %irurile dumneavoastr nu dep%esc <@@ de caractere,
#olosi&i tipul de coloan ec?ivalent 7()C'() si inde.a&i/l pe acela! Pute&i #olosi 7()C'() =<@@> 5*()O
pentru valorile 5L35, respectiv 7()C'() =<@@> pentru valorile "+B"!
*ntercorelarea pro$lemelor legate de selectarea tipului de coloan
u pute&i lua ,ntotdeauna ,n considerare pro$lemele legate de selectarea tipurilor de coloane ca %i cum acestea ar
#i independente una de alta! 4e e.emplu, ,n cazul tipurilor numerice domeniul este corelat cu dimensiunea
spa&iului de stocare0 c-nd domeniul creste, ave&i nevoie de o cantitate mai mare de spa&iu, ceea ce a#ecteaz
per#orman&ele! Ca alt e.emplu, lua&i ,n considerare implica&iile op&iunii de utilizare a atri$utului
(U"3N*C)+M+" pentru crearea unei coloane care s con&in numere de secven& unice! 3p&iunea
respectiv are numeroase consecin&e, care implic tipul coloanei, inde.area %i utilizarea valorii ULLJ
(U"3N*C)+M+" este un atri$ut de coloan care tre$uie #olosit numai cu tipuri ,ntregi! (st#el, op&iunile
dumneavoastr sunt imediat limitate la tipurile cuprinse ,ntre "*O*"%i5*I*"!
Coloanele (U"3N*C)+M+" tre$uie inde.ate de a%a manier ,nc-t numrul curent ma.im din cadrul
secven&ei s poat #i determinat rapid, #r a necesita o parcurgere complet a ta$elului, ,n continuare, pentru a
preveni reutilizarea numerelor din secven&, inde.ul tre$uie s #ie unic! (ceasta ,nseamn c tre$uie s declara&i
coloana ca P)*M()O ]+O sau ca inde. de tip U*QU+!
4ac versiunea dumneavoastr de MySQL este anterioar versiunii 2!<2!<, coloanele inde.ate nu pot con&ine
valori ULL, deci tre$uie s declara&i coloana ca #iind de tip 3"
ULL!
188 Partea l Utilizarea general a sistemului MySQL
"oate acestea ,nseamn c nu pute&i declara o coloan (U"3N*C)+M+" ast#elJ
col tipNar$itrar (U"3N*C)+M+" 3 ast#el de coloan se declar dup cum urmeazJ
col tipNintreg (U"3N*C)+M+" 3" ULL P)*M()O ]+O Sau ast#elJ
col tipNintreg (U"3N*C)+M+" 3" ULL, U*QU+=col>
3 consecin& suplimentar a utilizrii atri$utului (U"3N*C)+M+" este aceea c, atri$utul #iind destinat
generrii unei secven&e de valori pozitive, pute&i la #el de $ine s declara&i o coloan (U"3N*C)+M+" ca
#iind US*I+4J
col tipNintreg US*I+4 (U"3N*C)+M+" 3" ULL P)*M()O ]+O
col tipNintreg US*I+4 (U"3N*C)+M+" 3" ULL, U*QU+=col>
+valuarea e.presiilor %i conversia de tip
MySQL v permite s scrie&i e.presii care includ constante, apeluri la #unc&ii si re#erin&e A la coloane dintr/un
ta$el! (ceste valori pot #i com$inate #olosind di#erite categorii de & operatori, precum operatorii aritmetici sau de
compara&ie, iar termenii unei e.presii pot A #i grupa&i cu aAutorul parantezelor!
+.presiile apar cel mai #recvent ,n lista de selec&ie a coloanei %i ,n clauza U'+)+ a A instruc&iunilor S+L+C"J
S+L+C"
C3C("=nume, 1, 1, prenume>,
="3N4(OS=dataNdeces> / "3N4(OS=dataNnastere> M 2;@> F)3M pre%edinte U'+)+
dataNnastere V 11:00/1/11 (4 dataNdeces *S 3" ULL Fiecare coloan selectat reprezint o e.presie, ca %i
con&inutul clauzei U'+)+! 4e asemenea,L e.presiile mai apar ,n clauza U'+)+ a instruc&iunilor 4+L+"+ si
UP4("+, ,n clauza 7(LU+S => instruc&iunilor *S+)" si a%a mai departe!
C-nd MySQL ,nt-lne%te o e.presie, o evalueaz pentru a calcula un rezultat! 4e e.emplu =8d2> M =8/<> are
rezultatul ;! +valuarea e.presiilor poate necesita conversii de tiAG 4e e.emplu, MySQL converte%te numrul
:;09<1 ,ntr/o dat, %i anume 11::;/09/<v atunci c-nd numrul este #olosit ,ntr/un conte.t care necesit o valoare
de tip dat!
(ceast sec&iune discut modul ,n care pute&i scrie e.presii ,n MySQL, precum %i sunt regulile care guverneaz
di#eritele categorii de conversii de tip pe care le e.ecul MySQL ,n decursul procesului de evaluare a e.presiilor!
Fiecare dintre operator MySQL este prezentat aici, dar MySQL are un numr at-t de mare de #unc&ii, ,nc-t vot
a$orda numai c-teva! "otu%i, #iecare operator %i #iecare #unc&ie sunt prezentate ,n det ,n (ne.a C!
Capitolul < Lucrul cu date ,n MySQL %i SQL 18@
Scrierea e.presiilor
3 e.presie se poate reduce la o singur constantJ 3 Constant numeric
1 a$c1 Constant de tip %ir
+.presiile #olosesc apeluri la #unc&ii! Unele #unc&ii iau argumente =valori plasate ,ntre paranteze>, altele nu!
(rgumentele multiple tre$uie s #ie separate prin virgul! C-nd invoca&i o #unc&ie, argumentele pot #i delimitate
prin spa&ii, dar ,ntre numele #unc&iei si paranteza de desc?idere nu tre$uie s e.iste nici un spa&iuJ
3U=> Func&ie #r argumente
S")CMP =1 a$c1,1 de#1> Func&ie cu dou argumente
S")CMP= 1a$c1, 1de# > Sunt permise spatiile ,n Aurul argumentelor
S")CMP =1 a$c1,1 de#1> Spa&iile plasate dup numele #unc&iei sunt
interzise
4ac e.ist un spa&iu dup numele #unc&iei, analizorul MySQL poate interpreta numele #unc&iei ca pe un nume
de coloan! =umele #unc&iilor nu sunt cuvinte rezervate %i le pute&i #olosi pentru nume de coloan, dac dori&i!>
)ezultatul o$i%nuit este o eroare de sinta.!
,n e.presii se pot #olosi si valori din coloanele ta$elelor, ,n situa&ia cea mai simpl, c-nd ta$elul cruia ,i apar&ine
o coloan rezult evident din conte.t, o re#erin& de coloan se poate rezuma, pur si simplu, la numele coloanei,
,n #iecare din urmtoarele instruc&iuni S+L+C" este speci#icat un singur ta$el0 ast#el, re#erin&ele la coloane sunt
lipsite de ec?ivocJ
S+L+C" nume, prenume F)3M pre%edinte
S+L+C" nume, prenume F)3M mem$ru
4ac nu este clar identitatea ta$elului care va #i #olosit, numele coloanelor pot #i precedate de numele ta$elului!
4ac nu este clar nici mcar numele $azei de date care tre$uie #olosit, numele ta$elului poate #i precedat de
numele $azei de date! 4e asemenea, pute&i #olosi aceste #orme mai concrete ,n conte.te lipsite de ec?ivoc, dac
dori&i pur %i simplu s #i&i mai e.plicitJ
S+L+C"
pre%edinte!nume, pre%edinte!prenume, mem$ru!nume, mem$ru!prenume
F)3M pre%edinte, mem$ru
U'+)+ pre%edinte!nume b mem$ru!nume
S+L+C" sampNd$!elev!nume F)3M sampNd$!elev ,n #inal, pute&i com$ina toate aceste tipuri de valori pentru a
#orma e.presii mai comple.e!
"ipuri de operatori
MySQL include numeroase tipuri de operatori care pot #i #olosi&i pentru a com$ina termenii e.presiilor!
3peratorii aritmetici, prezenta&i ,n ta$elul <!1@, includ operatorii o$i%nui&i de adunare, scdere, ,nmul&ire %i
,mpr&ire, precum %i operatorul modulo! 3pera&iile aritmetice se e.ecut #olosind valori ,ntregi 5*I* " =de ;8
$i&i> pentru opera/
18; Partea l Utilizarea general a sistemului MySQL
torii _/, / si d atunci c-nd am$ii operanzi sunt ,ntregi, precum %i pentru operatorii M %i e l atunci c-nd opera&ia
este e#ectuat ,ntr/un conte.t unde se a%teapt ca rezultatul s #ie unL ,ntreg! )e&ine&i ca, dac o opera&ie implic
valori mari, ast#el ,nc-t rezultatul dep%e%te S domeniul pe ;8 de $i&i, ve&i o$&ine rezultate imprevizi$ile!
"a$elul <!1@ 3peratori aritmetici
3perator
Sinta.
a $
a / $ /a
a d $
a M $
a e $
Semni#ica&ie
(dunare0 suma operanzilor
Scdere0 di#eren&a ,ntre operanzi
Minus unar nega&ia operandului
,nmul&ire0 produsul operanzilor
,mpr&ire0 catul operanzilor
Modulo0 restul rmas dup ,mpr&irea operanzilor
3peratorii logici, prezenta&i ,n ta$elul <!1;, evalueaz e.presii pentru a determina da sunt adevrate =di#erite de
zero> sau #alse =zero>! MySQL include operatorii 6,n stil C1 ``S 11 %i L ca #orme alternative pentru (4, 3) %i
3"! 3$serva&i mai ales operatorul 110 (S^A SQL speci#ic 11 ca operator de concatenare a %irurilor, dar ,n
MySQL are semni#ica&ia unei opera&ii 3) =S(U> logice! 4ac e.ecuta&i urmtoarea interogare %i v a%tepta&i
aceasta s e.ecute concatenarea %irurilor, veri descoperi cu surprindere c returne numrul 0J
S+L+C" 1a$c1 ^^ 1de#1 \V 3
1 a$c1 si 1 de#1 sunt convertite ,n ,ntregi ,n vederea opera&iei, iar am$ele se trans#orm ,n 0! ,n MySQL, tre$uie
s #olosi&i #unc&ia C3C("= 1a$c1, 1de#1> pentru a e#ectua concatenarea %irurilor!
"a$elul <!1; 3peratori logici
3perator
(4, `` 3), ^^ 3", L
Sinta.
a (4 $, a `` $
a 3) $, a ^^ $ 3" a, la
Semni#ica&ie
*ntersec&ie logic0 adevrat dac am$ii operanzi sunt adevra&i
)euniune logic0 adevrat dac oricare din operanzi este adevrat
egare logic0 adevrat dac operandul este #als
3peratorii pe $it, prezenta&i ,n ta$elul <!1D, e.ecut intersec&ii %i reuniuni la nivel de l unde #iecare $it al
rezultatului este evaluat su$ #orma intersec&iei sau reuniunii logicd# $i&ilor corespunztori ai operanzilor! 4e
asemenea, pute&i e.ecuta deplasri ale $i&ilorKl^ st-nga sau la dreapta! 3pera&iile cu $i&i sunt e#ectuate #olosindu/
se valori ,ntregi 5*I*# =pe ;8 de $i&i>!
Capitolul < Lucrul cu date ,n MySQL %i SQL 18D
"a$elul <!1D 3peratori pe $it
3perator Sinta.
` a ` $
a Y $
a _ $
Semni#ica&ie
*ntersec&ie =(4> la nivel de $it0 #iecare $it al rezultatului este setat dac $i&ii corespunztori ai am$ilor operanzi
sunt seta&i
)euniune =3)> la nivel de $it0 #iecare $it al rezultatului este setat dac $itul corespunztor al oricruia dintre
operanzi este setat
4eplasare la st-nga a lui a cu $ pozi&ii de $it 4eplasare la dreapta a lui a cu $ pozi&ii de $it
3peratorii de compara&ie, prezenta&i ,n ta$elul <!19, includ operatori pentru testarea mrimii relative sau a
aranArii le.icogra#ice a numerelor %i a %irurilor, precum %i operatori pentru sta$ilirea coresponden&ei cu un
model si pentru detectarea valorilor ULL! 3peratorul \bV este speci#ic lim$aAului MySQL %i a #ost introdus ,n
MySQL 2!<2!
"a$elul <!19 3peratori de compara&ie
3perator
*
5+"U++
L*]+
3" L*]+ )+I+BP
Sinta.
a b $
a Lb $, a \V $
a \ $
a \b $
a Vb $
a V $
a * =$1, $<, !!!
a 5+"U++ $ (4 C
a L*]+ $
a 3" L*]+ $
a )+I+BP $
3" )+I+BP a 3" )+I+BP $
*S ULL
*S 3" ULL
a \bV $
a *S ULL
a *S 3" ULL
Semni#ica&ie
(devrat dac operanzii sunt egali (devrat dac operanzii sunt di#eri&i (devrat dac a este mai mic dec-t $
(devrat dac a este mai mic sau egal cu $ (devrat dac a este mai mare sau egal cu $ (devrat dac a este mai
mare dec-t $ > (devrat dac a este egal cu oricare din termenii $l, $<,!!! (devrat dac a se a#l ,ntre valorile
lui $ si c, inclusiv $ %i c
Coresponden& cu modelul ,n SQL0 adevrat dac a corespunde cu $
Coresponden& cu modelul ,n SQL0 adevrat dac a
nu corespunde cu $
Coresponden& cu o e.presie regulat e.tins0 adevrat
dac a corespunde cu $
Coresponden& cu o e.presie regulat e.tins0 adevrat
dac a nu corespunde cu $
(devrat dac operanzii sunt egali =c?iar dac au valoarea ULL>
(devrat dac operandul este ULL (devrat dac operandul nu este ULL
3peratorul 5*()O este disponi$il ,ncep-nd cu MySQL versiunea 2!<2 si poate #i #olosit pentru conversia unui
%ir ,ntr/un %ir $inar, ast#el ,nc-t s #ie sensi$il la di#eren&a ,ntre
189 Partea l Utilizarea general a sistemului MySQL
maAuscule %i minuscule ,n cazul compara&iilor! Prima dintre urmtoarele compara&ii miK este sensi$il la di#eren&a
,ntre maAuscule si minuscule, dar a doua si a treia suntJ
1a$c1 b 1($c1 1
5*()O 1a$c1 b 1($c1 3
1a$c1 b 5*()O 1($c1 3
u e.ist nici o conversie corespunztoare 3" 5*()O! 4ac dori&i s #olosi&i o coloana at-t ,ntr/un conte.t
sensi$il la di#eren&a ,ntre maAuscule %i minuscule, c-t si ,ntr/un conte.t #r aceast caracteristic, #olosi&i un tip
de coloan care nu este sensi$il la di#eren&at ,ntre maAuscule %i minuscule %i utiliza&i 5*()O pentru acele
compara&ii pe care le dori&iW sensi$ile la di#eren&a ,ntre maAuscule %i minuscule!
Compara&iile sunt ,ntotdeauna sensi$ile la di#eren&a ,ntre maAuscule %i minuscule pentru, coloanele pe care le
declara&i #olosind un tip de %ir $inar =C'() 5*()O, 7()C'() 5*()OK %i tipurile 5L35>! Pentru a o$&ine
o compara&ie care nu este sensi$il la di#eren&a ,ntre maAuscule si minuscule pentru un asemenea tip de coloan,
#olosi&i UPP+) => sau L3U+) =>K pentru a converti am$ii operanzi la aceea%i mrime a litereiJ
UPP+)=numeNcoloana> \ UPP+)=1lonescu1> K
L3U+)=numeNcoloana> \ L3U+)=1lonescuK> R12
Pentru compara&ii ,ntre %iruri care nu sunt sensi$ile la di#eren&a ,ntre maAuscule %0 minuscule, este posi$il ca mai
multe caractere s #ie considerate ec?ivalente, ,n #unc&ii de setul dumneavoastr de caractere! 4e e.emplu, + si +
s/ar putea s #ie tratate identiY= ,n cadrul opera&iilor de compara&ie %i ordonare! Compara&iile $inare =sensi$ile la
di#er renta ,ntre maAuscule si minuscule> se e.ecut #olosind valorile (SC** ale caracterelor!
Coresponden&a cu un model v aAut s cuta&i valori #r a #i o$ligat s speci#ica&i o valoari literal e.act!
MySQL #urnizeaz coresponden&a cu un model din SQL #olosind operato/R nil L*]+ %i caracterele de ,nlocuire
e =corespunde oricrei secven&e de caractere> si N =cores/i_ punde oricrui caracter individual>! 4e asemenea,
MySQL #urnizeaz coresponden&a cu model $az-ndu/se pe operatorul )+I+BP %i pe e.presiile regulate e.tinse
care sunt simil0 celor #olosite ,n programele U*B precum grep, %ed si vi! "re$uie s #olosi&i unul dim ace%ti
operatori de sta$ilire a coresponden&elor cu un model pentru a e#ectua sta$ili coresponden&ei cu un model0 nu
pute&i #olosi operatorul b! Pentru a inversa sensul uni opera&ii de sta$ilire a coresponden&ei cu un model, #olosi&i
3" L*]+ sau 3" )+I+BP!
Cele dou tipuri de sta$ilire a coresponden&ei cu un model di#er su$ dou aspecte import tante, dincolo de
utilizarea unor operatori di#eri&i %i a unor caractere de model di#eriteJ!,
L*]+ nu este sensi$il la di#eren&a ,ntre maAuscule si minuscule dec-t dac minimum operand este un %ir $inar!
)+I+BP este sensi$il la di#eren&a ,ntre maAuscule si minuscule1d
Modelele SQL corespund cu valoarea gsit numai dac ,ntregul %ir corespunde +.presiile regulate corespund
dac modelul este gsit oriunde ,n interiorul %irului!
10 ,ncep-nd de la versiunea 2!<2!8, )+I+BP nu mai este sensi$il la di#eren&a ,ntre maAuscule %i mimi cule dec-t
dac minimum un operand este un %ir $inar! / !(!
Capitolul < Lucrul cu date ,n MySQL %i SQL 18:
Modelele #olosite cu operatorul L*]+ pot include caracterele de ,nlocuire e %i N! 4e e.emplu, modelul 1elee1
corespunde tuturor %irurilor care ,ncep cu 1ele1J
1elevat1 L*]+ 1elee1 d 1
1elementar1 L*]+ 1elee1 d 1
Caracterul de ,nlocuire e corespunde oricrei secven&e de caractere, inclusiv cu secven&a vid, deci 1elee1
corespunde lui 1ele1J
1ele1 L*]+ 1elee1 tV 1
(ceasta mai ,nseamn c modelul 1e1 corespunde oricrui %ir, inclusiv %irului vid! "otu%i, 17 nu va corespunde
valorii ULL! 4e #apt, orice sta$ilire de coresponden& cu un model care con&ine un operand ULL va e%uaJ
1ele1 L*]+ ULL 3 ULL
ULL L*]+ 1elee1 d ULL
3peratorul L*]+ din MySQL nu este sensi$il la di#eren&a ,ntre maAuscule %i minuscule, dec-t dac unul din
operanzii si este un %ir $inar! (st#el, 1elee1 este ec?ivalent ,n mod presta$ilit at-t cu %irul 1elevat1 c-t %i cu %irul
1+levat1, dar ,ntr/o compara&ie $inar va #i ec?ivalent numai cu unul din cele dou %iruriJ
1+levat1 L*]+ 1elee1 d 1
1elevat1 L*]+ 1elee1 o 1
5*()O 1elevat1 L*]+ 1elee1 o 1
5*()O 1+levat1 L*]+ 1ele7 \d 3
(cest lucru nu se ,nt-mpl ,n cazul operatorului L*]+ din (S* SQL, care este sensi$il la di#eren&a ,ntre
maAuscule %i minuscule!
Caracterul de ,nlocuire poate #i speci#icat oriunde ,n interiorul modelului! 4e e.emplu, 1eat1 este ec?ivalent cu
1$irocrat1, 1colorat1 sau 1aristocrat1! Pe de alt parte, 1eate1 este ec?ivalent cu toate %irurile de mai sus, dar si
cu %iruri gen 1crater1, 1atent1 sau 1straturi1!
Cellalt caracter de ,nlocuire permis pentru L*]+ este N, care corespunde oricrui caracter
individual!NNNcorespunde oricrui %ir #ormat din e.act trei caractere, 1aNr1 corespunde cu 1aer1 %i 1aur1 %i c?iar
cu 1aNr1, deoarece N este ec?ivalent cu el ,nsu%i!
Pentru a dezactiva semni#ica&ia special a caracterelor de ,nlocuire e si N, pentru a corespunde instan&elor
literale ale acestor caractere, preceda&i/le cu un $acGslas? =He sau HN>J
1a$c1 L*]+ 1aec1 \d 1
1a$c1 L*]+ 1aHec1 W 3
1aec1 L*]+ 1aHec1 \d 1
Cealalt #orm #olosit ,n MySQL pentru sta$ilirea coresponden&elor cu un model #olose%te e.presiile regulate!
3peratorul este )+I+BP, nu L*]+! =)L*]+ este un sinonim pentru )+I+BP!> Caracterele de model cele mai
#olosite ,n cazul e.presiilor regulate sunt urmtoareleJ
corespunde oricrui caracter individualJ
1a$c1 )+I+BP 1a!c1 o 1

S-ar putea să vă placă și