Mysql 100
Mysql 100
a 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 v H1 H$ Hn UL =(SC** 0> I?ilimele simple I?ilimele du$le Etergere caracter anterior Caracter linie nou
Hr Ht HH
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 L3 I5L35 "* O"+B" "+B" M+4*UM"+B" L3 I"+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* " U S*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, U S*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 U S*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 U S*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*3 L =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* " U S*I +4, ismall SM(LL* ", ismallNu SM(LL* " U S*I +4, imedium M+4*UM* ", imediumNu M+4*UM* " U S*I +4, ireg * ", iregNu * " U S*I +4, i$ig 5*I* ", i$igNu 5*I* " U S*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! U S*I +4! (cest atri$ut interzice valorile negative! 4ac o coloan prime%te atri$utul U S*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* " U S*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 <@@! U S*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 U S*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 U S*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 KC1 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 * " U S*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 U S*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* " U S*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 * " U S*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" L3 I5L35, L3 I"+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 varc?ar=10> O+S ULL c< varc?ar=10> O+S 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 O+S ULL O+S ULL O+S 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, L3 I5L35> 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", L3 Q"+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 = 1 1 , 141 > pot #i numai 1 1 sau 141! (lternativ, pute&i #olosi + UM pentru rspunsuri la ,ntre$ri cu op&iuni multiple dintr/un C1 c< c2 c?ar=1> c?ar=<> c?ar=2>
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 1 1 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* " U S*I +4 si SM(LL* " U S*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 2 ; : 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 ana ion nae ela 1 < 2 8 0 < 2 8 @ 1
)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> 1 10 100 1000 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 C3 C("= >%i sort-nd rezultatulJ mysjlV S+L+C" C3 C("=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 ana ion nae ela 1 < 8 9 0
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 C3 C(" =>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 U S*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* U S*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 U S*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 U S*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 U S*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 * " U S*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 L3 I5L35 #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" L3 I"+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 L3 I5L35 )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 U S*I +4J col tipNintreg U S*I +4 (U"3N* C)+M+ " 3" ULL P)*M()O ]+O col tipNintreg U S*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" C3 C("=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 ad $ aM $ ae $ 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 C3 C("= 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`$ aY$ 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 d1 1elevat1 L*]+ 1elee1 o1 5* ()O 1elevat1 L*]+ 1elee1 o1 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 W3 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