Documente Academic
Documente Profesional
Documente Cultură
• Categoriile generale de valori pe care le poate reprezenta MySQL, inclusiv valoarea NULL.
• Tipurile concrete de date pe care le furnizează MySQL pentru coloanele tabelelor, precum şi proprietăţile care
caracterizează fiecare tip de coloană. Unele dintre tipurile de coloane MySQL au un caracter destul de general,
cum este tipul sir CHAR. Alte tipuri, cum este TIMESTAMP, au comportări speciale, pe care trebuie să le
înţelegeţi pentru a evita surprizele.
• Alegerea adecvată a tipului de coloană pentru tabelele dumneavoastră. Este important să ştiţi modul de a alege
tipul cel mai adecvat intereselor dumneavoastră când construiţi un tabel, 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.
• Regulile MySQL pentru evaluarea expresiilor. MySQL oferă o gamă largă de operatori şi funcţii pe care le
puteţi folosi pentru a regăsi, afişa şi manipula date. Regulile pentru evaluarea expresiilor includ regulile care
controlează conversiile de tip, atunci când o valoare de un tip este folosită într-un context care impune o valoare
de un alt tip.
Este important să înţelegeţi când se produce şi cum funcţionează conversia de tip; unele conversii nu au nici un
sens si generează valori fără nici o semnificaţie. Prin repartizarea şirului "13" într-o coloană întreagă se obţine
valoarea 13, dar repartizarea şirului "abc" în coloana respectivă are ca rezultat valoarea O, deoarece "abc" nu
arată ca un număr. Mai rău, dacă efectuaţi o comparaţie fără a cunoaşte regulile de conversie puteţi provoca
pagube serioase, cum ar fi actualizarea sau ştergerea tuturor rândurilor dintr-un tabel atunci când intenţionaţi să
modificaţi numai câteva rânduri.
Două anexe conţin informaţii suplimentare despre tipurile de coloane, operatorii şi funcţiile MySQL. Acestea
sunt Anexa B, „Referinţă de tipuri de coloane", respectiv Anexa C, „Referinţă de operatori şi funcţii".
Tipuri de date MySQL
MySQL „cunoaşte" numeroase tipuri de date, în speţă categorii generale în care pot fi reprezentate diverse
valori.
Valori numerice
Numerele sunt valori precum 48 sau 193.62. MySQL înţelege numere specificate ca întregi (fără parte
fracţionară) sau valori cu virgulă mobilă (cu parte fracţionară). întregii pot fi specificaţi în format zecimal sau
hexazecimal.
Un întreg constă dintr-o secvenţă de cifre. Un întreg specificat în formă hexazecimală constă din secvenţa Ox
urmată de una sau mai multe cifre hexazecimale (cuprinse între 0-9, respectiv a-f). De exemplu, OxOa este 10 în
format zecimal, iar Oxf f f f este 65535 în format zecimal. Cifrele hexazecimale non-numerice pot fi specificate
cu majuscule sau minuscule, dar secvenţa de început Ox nu poate fi scrisă sub forma OX. Cu alte cuvinte, OxOa
si OxOA sunt corecte, dar OXOa şi OXOA nu sunt.
Un număr cu virgulă mobilă constă dintr-o secvenţă de cifre, o virgulă de separare a părţii fracţionare şi o altă
secvenţă de cifre. Una dintre cele două secvenţe de cifre poate fi vidă, dar nu ambele simultan.
Capitolul 2 Lucrul cu date în MySQL şi SQL 101
MySQL înţelege notaţia ştiinţifică. Aceasta este indicată prin inserţia imediat după un număr întreg sau în
virgulă mobilă a literei e sau E, unui caracter semn (+ sau -) şi unui exponent întreg. 1.34E+12 şi 43.27e-1
reprezintă numere scrise în notaţie ştiinţifică corectă. Pe de altă parte, 1.34E12 nu este scris corect, deoarece
lipseşte caracterul semn înaintea exponentului. Numerele hexazecimale nu pot fi folosite în notaţiile ştiinţifice;
caracterul e care se află la începutul exponentului este, de asemenea, o cifră hexazecimală corectă şi astfel se pot
crea confuzii.
Numerele pot fi precedate de un semn minus (-) pentru a semnala o valoare negativă.
Valori şir (caracter)
Şirurile sunt valori ca "Bucureşti, România" sau "pacientul se simte mai bine". Pentru a delimita o valoare şir se
pot folosi ghilimele simple sau duble.
în interiorul şirurilor se pot folosi numeroase secvenţe escape, care se pot folosi pentru a preciza caractere
speciale, aşa cum se poate vedea în tabelul 2.1. Fiecare secvenţă începe cu un caracter backslash (\) pentru a
semnifica o excepţie temporară de la regulile obişnuite de interpretare a caracterelor. Reţineţi că un octet NUL
nu este unul şi acelaşi lucru cu o valoare NULL; NUL este un octet de valoare zero, în timp ce NULL semnifică
absenţa unei valori.
Tabelul 2.1 Secvenţe escape din şiruri
Secvenţă Semnificaţie
\o NUL (ASCII 0)
v Ghilimele simple
\" Ghilimele duble
\b Ştergere caracter anterior
\n Caracter linie nouă
\r Retur de car
\t Caracter de tabulare
\\ Backslash
Pentru a include ghilimele într-un şir, puteţi proceda astfel:
• Dublaţi ghilimelele, dacă şirul este inclus între ghilimele folosind acelaşi caracter:
'Anii "701
"El zise: ""Ti-am spus eul"""
• încadraţi şirul folosind celelalte ghilimele; în acest caz, nu dublaţi ghilimelele din şir:
"Anii '70"
'El zise: "Ti-am spus eul"'
• Anulaţi semnificaţia ghilimelelor cu un caracter backslash; această metodă este aplicabilă indiferent de tipul
ghilimelelor folosite pentru a încadra şirul;
'Anii \'70' 'Anii \'70"
102 Partea l Utilizarea generală a sistemului MySQL
"El zise: \"Ti-am spus eul\""
'El zise: \"Ti-am spus eu!\"'
în contextele şirurilor, se pot folosi constantele hexazecimale pentru a specifica valorile de tip şir. Sintaxa este
cea descrisă anterior pentru valorile numerice, dar perechile de cifre hexazecimale sunt interpretate drept coduri
ASCII si sunt convenite în caractere. Rezultatul este folosit sub formă de şir. De exemplu, când este interpretat
sub formă de şir, 0x616263 este "abc".
Valori de tip dată si oră (temporale)
Datele si orele sunt valori precum " 1999 - 06 -17" sau " 12:30:43". De asemenea, MySQL înţelege valorile
dată/oră combinate, precum "1999-06-17 12:30:43". Reţineţi faptul că MySQL reprezintă datele în ordinea an-
lună-zi. Acest lucru îi surprinde deseori pe începătorii în materie de MySQL, deşi acest format este standardul
SQL ANSI. Puteţi afişa valorile datelor în orice mod doriţi folosind funcţia DATE_FORMAT(), dar formatul de
afişare prestabilit afişează mai întâi anul, iar valorile de intrare trebuie specificate începând cu anul.
Valoarea NULL
NULL este un fel de valoare „fără tip", în general, este folosită cu semnificaţia „fără valoare", „valoare
necunoscută", „valoare lipsă", „în afara domeniului", „nici una din precedentele opţiuni" şi aşa mai departe.
Puteţi insera valori NULL în tabele, le puteţi regăsi din tabele şi puteţi testa dacă o valoare este sau nu NULL.
Nu puteţi efectua operaţii aritmetice cu valori NULL. (Dacă încercaţi, rezultatul este NULL.)
Tipuri de coloane MySQL
Fiecare tabel dintr-o bază de date este alcătuit dintr-una sau mai multe coloane. Când creaţi un tabel folosind o
instrucţiune CREATE TABLE, specificaţi un tip pentru fiecare coloană. Un tip de coloană este mai specific
decât un tip de date, care este numai o categorie generală de genul „număr" sau „şir". Un tip de coloană
caracterizează cu exactitate categoria de valori pe care o poate conţine o coloană a unui tabel dat, cum este
SMALLINT sau VARCHAR(32).
Tipurile de coloane MySQL reprezintă mijloacele prin care descrieţi categoriile de valori pe care le conţin
coloanele unui tabel, care, la rândul lor, determină modul în care MySQL tratează aceste valori. De exemplu,
dacă aveţi valori numerice, le puteţi stoca folosind un tip de coloană numeric sau şir, dar MySQL va trata
valorile oarecum diferit, în funcţie de modul în care le stocaţi. Fiecare tip de coloană are numeroase
caracteristici:
• Ce tip de valori puteţi stoca în coloana respectivă
• Spaţiul pe care îl ocupă valorile, precum şi dacă valorile sunt de lungime fixă (toate valorile de acel tip ocupă
aceeaşi cantitate de spaţiu) sau de lungime variabilă (cantitatea de spaţiu depinde de valoarea particulară stocată)
• Modul de comparare si stocare a valorilor din tipul respectiv
Capitolul 2 Lucrul cu date în MySQL şi SQL 103
• Dacă tipul respectiv acceptă sau nu valori NULL
• Dacă tipul respectiv poate fi indexat sau nu
Vom examina succint tipurile de coloană MySQL pentru a avea o imagine de ansamblu, după care vom discuta
mai detaliat proprietăţile care caracterizează fiecare tip.
O examinare a tipurilor de coloane
MySQL furnizează tipuri de coloane pentru valori din toate categoriile generale de tipuri de date, cu excepţia
valorii NULL. Valoarea NULL acoperă toate tipurile, în sensul că posibilitatea unei coloane de a conţine sau nu
valori NULL este tratată ca atribut de tip. MySQL are tipuri de coloane atât pentru valorile întregi, cât şi pentru
cele cu virgulă mobilă, aşa cum se poate vedea în tabelul 2.2. Coloanele întregi pot fi cu sau fără semn. Un
atribut special permite valorilor din coloanele întregi să fie generate automat, ceea ce este util în aplicaţii care
impun numere dintr-o secvenţă sau de identificare unice.
Tabelul 2.2 Tipuri de coloane numerice
Numele tipului
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
FLOAT
DOUBLE
DECIMAL
Semnificaţie
Un întreg foarte mic
Un întreg mic
Un întreg de dimensiune medie
Un întreg standard
Un întreg mare
Un număr cu virgulă mobilă în precizie simplă
Un număr cu virgulă mobilă în dublă precizie
Un număr cu virgulă mobilă, reprezentat sub formă de şir
Tipurile de coloane şir din MySQL sunt prezentate în tabelul 2.3. Şirurile pot conţine orice, chiar si date binare
arbitrare, cum sunt imaginile sau sunetele. Şirurile pot fi comparate în funcţie de sensibilitatea lor la diferenţa
între majuscule şi minuscule. De asemenea, puteţi efectua cu şiruri stabilirea de corespondenţe cu un model. (De
fapt, în MySQL puteţi efectua stabilirea de corespondenţe cu un model pentru orice tip de coloane, dar această
operaţie se execută cel mai frecvent cu tipuri şir.)
Tabelul 2.3 Tipuri de coloane şir _________________
Numele tipului
CHAR
VARCHAR
TINYBLOB
BLOB
MEDIUMBLOB
Semnificaţie
Un şir de caractere de lungime fixă Un şir de caractere de lungime variabilă Un BLOB (obiect binar mare) foarte
mic Un BLOB mic Un BLOB de dimensiuni medii
Continuare
104 Partea l Utilizarea generală a sistemului MySQL Tabelul 2.3 Continuare
Numele tipului
LONGBLOB
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
ENUM
SET
Semnificaţie
Un BLOB de dimensiuni mari
Un şir text foarte mic
Un şir text mic
Un şir text de dimensiuni medii
Un şir text de mari dimensiuni
O enumerare; coloanelor li se poate atribui un membru al enumerării
Un set; coloanelor li se pot atribui mai mulţi membri ai unui set
Tipurile date şi oră din MySQL sunt prezentate în tabelul 2.4. Pentru valori temporale, MySQL furnizează tipuri
pentru date (cu sau fără oră), ore şi amprente de timp (un tip special, care vă permite să detectaţi data şi ora
efectuării ultimei modificări într-o înregistrare). De asemenea, există un tip pentru reprezentarea eficientă a
valorilor anilor, atunci când nu aveţi nevoie de o dată completă.
Tabelul 2.4 Tipuri de coloane dată şi oră
Numele tipului Semnificaţie
DATE O valoare pentru dată, în format "AAAA-LL -22'
TIME O valoare pentru oră, în format 'hh:mm:ss'
DATETIME O valoare pentru dată si oră, în format 'AAAA-LL -ZZ hh :mm:ss'
TIMESTAMP O valoare pentru amprenta de timp, în format AAAALLZZhhmmss
YEAR O valoare pentru an, în format AAAA
Pentru a crea un tabel, emiteţi o instrucţiune CREATE TABLE şi specificaţi o listă a coloanelor care alcătuiesc
tabelul. Fiecare coloană are un nume şi un tip, iar la fiecare tip se pot asocia mai multe atribute. Iată un exemplu
care creează un tabel denumit tabeluljneu, cu trei coloane, denumite f, c şi i: CREATE TABLE tabeluljneu
f FLOAT(10,4),
C CHAR(15) NOT NULL DEFAULT "nimic",
i TINYINT UNSIGNED NULL
Sintaxa pentru declararea unei coloane este următoarea:
nume_col tip_col [atribute_coloana] [atribute_generale] Numele coloanei este dat de nume_col. Numele
coloanelor pot avea o lungime de maxi- "J mum 64 de caractere şi pot fi alcătuite din caractere alfanumerice,
precum si din carac-1 terul de subliniere şi simbolul dolarului (în speţă _ şi $). Un nume de coloană poate J
începe cu orice caracter admis într-un nume, inclusiv cu o cifră. Totuşi, urt nume fltrjl poate fi compus integral
din cifre, deoarece astfel ar deveni practic confundabil cu unii
Capitolul 2 Lucrul cu date în MySQL şi SQL 105
număr. Cuvinte precum SELECT, DELETE sau CREATE sunt rezervate şi nu pot fi folosite drept nume de
coloană. Totuşi, numele funcţiilor (cuvinte precum POS şi MI N) nu sunt rezervate si pot fi folosite.
Tipul de coloană tip_col precizează categoria exactă de valori pe care le poate conţine coloana. Specificatorul de
tip mai poate indica şi lungimea maximă a valorilor pe care le stocaţi în coloană. Pentru unele tipuri, specificaţi
lungimea în mod explicit sub formă numerică. Pentru altele, lungimea se deduce din numele tipului. De
exemplu, CHAR (10) specifică o lungime explicită de 10 caractere, în timp ce valorile TINYBLOB au o lungime
maximă implicită de 255 caractere. Unii dintre specificatorii de tip vă permit să indicaţi o lăţime maximă afişată
(numărul de caractere de utilizat pentru afişarea valorilor). Tipurile de coloane cu virgulă mobilă permit
specificarea numărului de cifre după virgulă, astfel încât să puteţi controla nivelul de precizie al valorilor.
După tipul coloanei, puteţi specifica atribute opţionale specifice unui anumit tip, precum si atribute de ordin mai
general. Atributele funcţionează ca modificatori de tip. Acestea determină programul MySQL să modifice într-
un fel sau altul tratamentul aplicat valorilor din coloană:
• Atributele permise specifice tipului depind de tipul de coloană pe care îl alegeţi. De exemplu, UNSIGNED este
permis numai pentru tipurile întregi, iar BINARY este permis numai pentru tipurile CHAR si VARCHAR.
• Atributele generale pot fi date pentru orice tip de coloană, cu anumite excepţii. Puteţi specifica NULL sau NOT
NULL pentru a preciza dacă o coloană poate conţine sau nu valori NULL. De asemenea, puteţi specifica
DEFAULT valoare_prestabilita pentru a arăta că o coloană trebuie să primească valoarea valoare_prestabilita
atunci când este creat un rând nou fără a se specifica în mod explicit valoarea coloanei. Valoarea
valoare_prestabilita trebuie să fie o constantă; nu poate fi o expresie şi nici nu poate face referire la alte coloane.
Nu puteţi specifica o valoare prestabilită pentru coloanele BLOB sau TEXT.
Dacă sunt precizate mai multe atribute specifice unei anumite coloane, acestea pot fi precizate în orice ordine, cu
condiţia ca acestea să respecte tipul coloanei şi să preceadă toate atributele generale. Similar, dacă sunt date mai
multe atribute generale, ele pot fi specificate în orice ordine, cu condiţia să respecte tipul coloanei şi să fie
plasate după toate atributele specifice de coloană existente.
în continuare, această secţiune discută despre fiecare dintre tipurile de coloană MySQL, pentru a prezenta sintaxa
utilizată la declararea tipului şi proprietăţile care o caracterizează, cum ar fi cerinţele privind domeniul şi
capacitatea de stocare. Specificaţiile de tip sunt prezentate aşa cum sunt utilizate acestea în instrucţiunile
CREATE TABLE. Informaţiile opţionale sunt încadrate între paranteze drepte ([ ]). De exemplu, sintaxa
MEDIUMINT[ (M) ] arată că lăţimea maximă de afişare, specificată sub forma (M), este opţională. Pe de altă
parte, pentru CHAR (M), lipsa parantezelor arată că (M) este obligatorie.
Reprezentarea numerică a coloanelor SET este puţin diferită de aceea a coloanelor ENUM. Membrii unui set nu
sunt numerotaţi secvenţial, în schimb, fiecărui membru îi corespunde unui bit individual în valoarea SET. Primul
membru al setului corespunde bitului O, al doilea membru corespunde bitului l etc. O valoare SET numerică
egală cu O corespunde şirului vid. Membrii SET sunt stocaţi ca valori pe biţi. în acest mod se pot stoca în fiecare
octet câte opt valori ale unui set, deci dimensiunea spaţiului de stocare a unei coloane SET este determinată de
numărul de membri ai setului, până la o valoare maximă de 64 de membri. Valorile SET pot ocupa l, 2,3,4 sau 8
octeţi pentru dimensiuni ale setului cuprinse respectiv între 1-8, 9-16, 17-24, 25-32 si 33-64.
Reprezentarea unei valori SET sub forma unui set de biţi este cea care îi permite unei asemenea valori să fie
alcătuită din mai mulţi membri ai unui set. într-o valoare se poate stabili orice combinaţie de biţi, deci valoarea
poate fi alcătuită din orice combinaţie de şiruri din declaraţia SET care corespund acestor biţi.
Iată un exemplu care ilustrează relaţia dintre forma şir si forma numerică a unei coloane SET; valoarea numerică
este afişată atât în formă zecimală, cât si în formă binară:
mysql> CREATE TABLE s_tabel (s SET("ana-,"ion",-nae","ela"));
mysql> INSERT INTO s_tabel
VALUES("ana"), ("ion"), ("nae'),Cela"),("),(NULL);
mysql> SELECT s, s+0, BIN(s+0) FROM s_tabel;
s s+o BIN(s+0)
ana 1 1
ion 2 10
nae 4 100
ela 8 1000
0 0
NULL NULL NULL
Dacă repartizaţi într-o coloană SET o valoare care conţine sub-siruri ce nu au foşti menţionate ca membri ai
setului, aceste şiruri sunt eliminate si în coloană este repartizată! o valoare care constă din sub-şirurile rămase.
Când repartizaţi valori în coloanele S£t,| nu este necesar ca sub-şirurile să fie menţionate în aceeaşi ordine pe
care aţi folosit-oi atunci când aţi declarat coloana. Totuşi, când regăsiţi valoarea ulterior, membrii vor fii
menţionaţi în ordinea de declarare. Să presupunem că specificaţi o coloană SET pentru a| reprezenta articole de
mobilier, folosind următoarea declaraţie:
Capitolul 2 Lucrul cu date în MySQL şi SQL 125
SET("masa","lampa","scaun")
Dacă repartizaţi în această coloană valoarea "scaun,canapea,masa", se vor întâmpla două lucruri. Primul: şirul
"canapea" dispare, deoarece nu este un membru al setului. Al doilea: când regăsiţi valoarea ulterior, aceasta
apare sub forma" masa, scaun". Acest lucru se produce deoarece MySQL determină biţii care corespund fiecărui
sub-şir al valorii care trebuie repartizate şi îi activează în cadrul valorii stocate. Sub-şirul" canapea" nu
corespunde nici unui bit si este ignorat. La regăsire, MySQL construieşte valoarea şirului din valoarea numerică
prin parcurgerea biţilor în ordine, fapt care are ca efect reordonarea automată a sub-şirurilor în ordinea folosită la
declararea coloanei. Această caracteristică mai are şi următoarea semnificaţie: dacă specificaţi un membru al
setului de mai multe ori într-o valoare, acesta va apărea o singură dată la regăsirea valorii. Dacă repartizaţi
valoarea "lampa,lampa,lampa" într-o coloană SET, la regăsire aceasta va avea numai valoarea " lampa".
Faptul că MySQL modifică ordinea membrilor dintr-o valoare SET înseamnă că, în cazul în care căutaţi valori
folosind un şir, trebuie să enumeraţi membrii în ordinea adecvată. Dacă inseraţi "scaun,masa" si apoi căutaţi
"scaun,masa", nu veţi găsi nimic; trebuie să căutaţi valoarea "masa, scaun".
Sortarea şi indexarea coloanelor ENUM şi SET se realizează în conformitate cu valorile interne (numerice) ale
valorilor din coloana. Exemplul următor ar putea părea altfel incorect, deoarece valorile nu sunt sortate în ordine
alfanumerică: mysql> SELECT e FROM e_tabel ORDER BY e;
NULL
ana ion nae ela
Valoarea NULL apare după sortare înaintea altor valori (sau după acestea, la sortarea în ordine descendentă).
Puteţi exploata sortarea ENUM dacă aveţi un set fixat de valori şi doriţi să le sortaţi într-o anumită ordine.
Atribuiţi coloanei tipul ENUM când creaţi tabelul şi menţionaţi valorile din enumerare în declaraţia coloanei, în
ordinea în care doriţi să fie sortate.
Pentru situaţii în care doriţi ca o coloană ENUM să fie sortată în ordine lexicografică normală, puteţi converti
coloana într-un şir non-ENUM folosind CONCAT( )şi sortând rezultatul: mysql> SELECT CONCAT(e) AS
e_str FROM e_tabel ORDER BY e_str;
e_str NULL
ana ela ion nae
126 Partea l Utilizarea generală a sistemului MySQL Atributele coloanelor de tip şir
Atributul BINARY poate fi specificat pentru tipurile CHAR şi VARCHAR pentru a determina tratarea valorilor
din coloană sub formă de şiruri binare (adică sensibile la diferenţa între majuscule si minuscule în cazul
operaţiunilor de comparare şi sortare).
Atributele generale NULL sau NOT NULL pot fi specificate pentru oricare dintre tipurile şir. Dacă nu specificaţi
nici unul din acestea, atributul prestabilit este NULL. Totuşi, declararea unei coloane de tip şir ca NOT NULL
nu împiedică introducerea unui şir vid. O valoare vidă este diferită de o valoare inexistentă, deci nu faceţi
greşeala de a crede că puteţi forţa o coloană şir să conţină valori nevide declarând-o NOT NULL, în cazul în care
cereţi ca valorile şirurilor să fie nevide, aceasta este o restricţie pe care trebuie să o impuneţi în cadrul propriilor
dumneavoastră aplicaţii.
De asemenea, puteţi specifica o valoare prestabilită folosind atributul DEFAULT pentru toate coloanele de tip
şir, cu excepţia tipurilor BLOB şi TEXT. Dacă nu specificaţi o valoare prestabilită, o asemenea valoare va fi
aleasă în mod automat. Pentru coloanele care pot'; conţine NULL, valoarea prestabilită este NULL. Pentru
coloane care nu pot conţine NULL, valoarea prestabilită este şirul vid, cu excepţia tipului ENUM, unde valoarea
prestabilită \ este primul membru al enumerării. (Pentru SET, valoarea prestabilită într-o coloană care nu poate
conţine NULL este de fapt setul vid, dar acesta este echivalent cu şirul vid.)
Coloane de tip dată şi oră
MySQL furnizează numeroase tipuri de coloane pentru valorile temporale: DATE, DATETIME, j TIME,
TIMESTAMP şi YEAR. Tabelul 2.9 prezintă tipurile furnizate de MySQL pentru] declararea coloanelor care
conţin valori pentru dată şi oră, precum şi domeniul valorilor] permise pentru fiecare tip. Tipul YEAR a fost
introdus în MySQL versiunea 3.22. Celelalte j tipuri au fost prezente în toate versiunile MySQL. Dimensiunile
necesare ale spaţiului dej stocare pentru fiecare tip sunt prezentate în tabelul 2.10.
Tabelul 2.9 Coloane de tip dată şi oră
Specificaţia tipului Domeniu f
DATE între "1000-01-01" şi "9999-12-31"
TIME între "-838:59:59" şi "838:59:59" (
DATETIME între "1000-01-01 00:00:00" şi "9999-12-31 23:59:59"
TIMESTAMP [(M)] între 19700101000000 şi undeva în anul 2037
YEAR[(M)] între 1901 Şi 2155
•^
Tabel 2.10 Dimensiunile spaţiului de stocare necesare pentru coloanele de tip dată şi oral Specificaţia tipului
Dimensiuni necesare ale spaţiului de stocare
DATE 3 octeţi (anterior versiunii MySQL 3.22,4 octeţi)
TIME 3 octeţi
DATETIME 8 OCteţi
Capitolul 2 Lucrul cu date în MySQL şi SQL 127
Specificaţia tipului
TIMESTAMP YEAR
Dimensiuni necesare ale spaţiului de stocare
4 octeţi 1 octet
Fiecare tip dată şi oră are o valoare " zero" care este stocată atunci când inseraţi o valoare care este incorectă
pentru tipul respectiv, aşa cum se poate vedea în tabelul 2.11. Această valoare este, de asemenea, valoarea
prestabilită pentru coloanele de tip dată şi oră care sunt declarate NOT NULL.
Tabelul 2.11 Valorile „zero" pentru coloanele de tip dată şi oră
Specificaţia tipului
DATE
TIME
DATETIME
TIMESTAMP
YEAR
Valoare „zero"
"0000-00-00" "00:00:00"
"0000-00-00 00:00:00" OQOOOOOOOOOOOO 0000
MySQL reprezintă întotdeauna datele începând cu anul, în conformitate cu specificaţia ANSI. De exemplu, 3
decembrie 1999 este reprezentat sub forma "1999-12-03". MySQL este oarecum lejer privind modul în care
permite specificarea datelor de intrare. De exemplu, va converti valorile anilor compuse din două cifre în valori
din patru cifre, iar dumneavoastră nu trebuie să furnizaţi un zero iniţial pentru valorile lunilor şi zilelor care sunt
mai mici decât 10. Totuşi, trebuie să specificaţi mai întâi anul. Formatele cu care sunteţi mai obişnuit, precum
"12/3/99" sau "3/12/99" vor fi interpretate incorect. Regulile folosite de MySQL pentru interpretarea datelor sunt
discutate în detaliu în paragraful „Lucrul cu coloanele de tip dată şi oră".
Valorile de tip oră sunt returnate conform fusului orar local al serverului; MySQL nu execută nici un fel de
modificări în funcţie de fusul orar ale valorilor pe care le returnează clientului.
Tipurile de coloane DATE, TIME şi DATETIME
Tipurile DATE, TIME şi DATETIME conţin valori de date, ore şi valori combinate de tip dată-oră. Formatele
sunt "AAAA-LL-ZZ", "hh:mm:ss", "AAAA-LL-ZZ hh:mm:ss". Pentru tipul DATETIME, partea de dată şi cea
de oră sunt obligatorii; dacă atribuiri o valoare DATE unei coloane DATETIME, MySQL adaugă automat o
parte de oră sub forma " 00:00:00".
MySQL tratează ora din valorile DATETIME şi TIME în moduri uşor diferite. Pentru DATETIME, partea de
oră reprezintă o oră din zi. Pe de altă parte, o valoare TIME reprezintă timpul scurs (iată de ce domeniul este atât
de mare si de ce sunt permise şi valorile negative). Partea din extremitatea dreaptă a valorii este considerată ca
indicând secunde deci, dacă inseraţi o valoare de oră „scurtă" (incomplet definită), precum "12:30" într-o
coloană TIME, valoarea stocată este "00:12:30", ceea ce este interpretat sub.forma „12 minute, 30 de secunde".
Puteţi folosi coloanele de tip TIME pentru a reprezenta ora din zi dacă doriţi, dar nu uitaţi de această regulă de
conversie dacă doriţi să evitaţi problemele. Pentru a insera valoarea „12 ore, 30 de minute", trebuie să o
specificaţi sub forma " 12:30:00".
128 Partea l Utilizarea generală a sistemului MySQL Tipul de coloană TIMESTAMP
Coloanele TIMESTAMP reprezintă valorile în formatul AAAALLZZhhmmss, cu un domeniu cuprins între
19700101000000 şi undeva în anul 2037. Domeniul este legat de ora UNIX, unde prima zi din 1970 este „ziua
zero", cunoscută şi sub numele de „epocă", începutul lui 1970 determină extremitatea inferioară a domeniului
TIMESTAMP. Extremitatea superioară a domeniului corespunde limitei de 4 octeţi a orei UNIX, care poate
reprezenta valori îi> anul 20376.
Tipul TIMESTAMP are această denumire (amprentă de timp - N.T.) deoarece are proprietatea specială de a
înregistra momentul creării sau al modificării unei înregistrări. Dacă inseraţi o valoare NULL într-o coloană
TIMESTAMP, valoarea coloanei devine automat aceea a datei si orei curente. Acest lucru se întâmplă si atunci
când creaţi sau actualizaţi un rând, dar nu atribuiţi coloanei nici o valoare explicită. Totuşi, numai prima coloană
TIMESTAMP dintr-un rând este tratată în acest mod şi, chiar şi pentru prima coloană, puteţi anula aplicarea
amprentei de timp prin inserţia în coloană a unei date şi a unei ore explicite în locul valorii NULL.
Declaraţia unei coloane TIMESTAMP poate include o specificaţie pentru o lăţime maximă de afişare M. Tabelul
2.12 afişează formatele de afişare pentru valorile permise ale lui M. Dacă M este omis dintr-o declaraţie
TIMESTAMP sau are o valoare egală cu O sau mai mare decât 14, coloana este tratată ca TIMESTAMP(14).
Valorile impare ale lui M cuprinse în intervalul 1-13 sunt asimilate următorului număr par imediat superior.
Tabelul 2.12 Formate de afişare pentru valorile TIMESTAMP Specificaţia tipului
TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(10) TIMESTAMP(8) TIMESTAMP(6) TIMESTAMP(4)
TIMESTAMP(2)
Formatul de afişare
AAAALLZZhhmmss
AAAALLZZhhmm
AALLZZhhmm
AAAALLZZ
AALLZZ
AALL
AA
Lăţimea de afişare pentru coloanele TIMESTAMP nu are nici o legătură cu dimensiunea spaţiului de stocare sau
cu valorile stocate intern. Valorile TIMESTAMP sunt întotdeauna stocate sub formă de 4 octeţi şi sunt folosite în
calcule cu precizie completă de 14 cifre, l indiferent de lăţimea de afişare. Pentru a vedea acest lucru, să
presupunem ca declaraţi un tabel după cum urmează, după care inseraţi câteva rânduri în tabel şi le regăsiţi:
6 Limita superioară a valorilor TIMESTAMP va creşte pe măsură ce sistemele de operare vor fi modifi- J cate
pentru a extinde limita superioară a valorilor orei UNIX. Acesta este un aspect care trebuie abordat la nivelul
bibliotecii de sistem. MySQL va exploata aceste modificări pe măsură ce acestea sunt efectuate. - N.A.
Capitolul 2 Lucrul cu date în MySQL şi SQL 129
CREATE TABLE tabeluljneu
ts TIMESTAMP(8), i INT
INSERT INTO tabeluljneu VALUES(19990801120000,3) INSERT INTO tabeluljneu
VALUES(19990801120001,2) INSERT INTO tabeluljneu VALUES(19990801120002,1)
• INSERT INTO tabeluljneu VALUES(19990801120003,0) SELECT * FROM tabeluljneu ORDER BY ts, i
Datele de ieşire ale instrucţiunii SELECT se prezintă astfel:
în aparenţă, rândurile sunt stocate într-o ordine greşită - valorile din prima coloană sunt toate identice, deci se
pare că sortarea ar trebui să aranjeze rândurile în conformitate cu valorile din a doua coloană. Acest rezultat
aparent anormal se datorează faptului că MySQL sortează în funcţie de valorile complete, cu 14 cifre, inserate în
coloana TIMESTAMP.
MySQL nu are nici un tip de coloane care să primească data şi ora creării înregistrării şi care să rămână imuabil
după aceea. Dacă doriţi să realizaţi acest lucru, puteţi proceda în două moduri:
• Folosiţi o coloana TIMESTAMP. Când înregistrarea este creată pentru prima dată, atribuiţi coloanei valoarea
NULL pentru a o iniţializa cu valoarea datei si a orei curente:
INSERT INTO nume_tabel (ts_col, ...) VALUES(NULL, ...) De fiecare dată când actualizaţi înregistrarea la
o dată ulterioară, atribuiţi în mod explicit coloanei valoarea pe care o are deja. Prin atribuirea unei valori
explicite se contracarează mecanismul de aplicare a amprentei de timp, deoarece împiedică actualizarea
automată a valorii coloanei:
UPDATE nume_tabel SET ts_col=ts_col WHERE ...
• Folosiţi o coloană DATETIME. Când creaţi o înregistrare, iniţializaţi coloana la valoarea NOW():
INSERT INTO nume_tabel (dt_col, ...) VALUES(NOW(), ...) La fiecare actualizare ulterioară a înregistrării,
lăsaţi coloana nemodificată:
UPDATE nutne_tabel SET /* orice IN AFARA DE coloana dt_col */ WHERE ... Dacă doriţi să folosiţi
coloanele TIMESTAMP pentru a păstra atât o valoare a orei creării, cât şi a orei ultimei modificări, puteri face
aceasta folosind o coloană TIMESTAMP pentru valoarea orei modificării, respectiv o altă coloană
TIMESTAMP pentru valoarea orei creării. Verificaţi ca ora modificării să fie inclusă în prima coloană
TIMESTAMP, astfel încât să fie configurată când înregistrarea este creată sau modificată. Faceţi din coloana cu
ora creării cea de-a doua coloană TIMESTAMP si iniţializati-o la valoarea NOW() atunci când creaţi înregistrări
noi. Astfel, valoarea sa va reflecta momentul creării înregistrării şi nu se va modifica ulterior.
v'tt&î
. fif"
130 Partea l Utilizarea generală a sistemului MySQL Tipul de coloană YEAR
YEAR este un tip de coloană pe un octet folosit pentru reprezentarea eficientă a valorilor anilor. Domeniul de
valori este cuprins între 1901 şi 2155. Puteţi folosi tipul YEAR atunci când doriţi să stocaţi informaţii despre
date calendaristice, dar aveţi nevoie numai de an, cum ar fi anul naşterii, anul alegerii în funcţia de preşedinte si
altele. Când nu aveţi nevoie de o valoare de tip dată completă, YEAR este mult mai eficient din punctul de
vedere al spaţiului utilizat decât alte tipuri de date.
Declaraţia unei coloane YEAR poate include o specificare a lăţimii de afişare M, care poate fi 4 sau 2. Dacă M
este omis dintr-o declaraţie de tip YEAR, valoarea prestabilită este 4.
TINYINT are aceeaşi dimensiune a spaţiului de stocare ca si YEAR (un octet), dar nu şi acelaşi domeniu. Pentru
a acoperi aceeaşi perioadă de timp ca şi YEAR folosind un tip întreg, aveţi nevoie de un SMALLINT, care
necesită o cantitate dublă de spaţiu. Dacă intervalul de timp în ani pe care trebuie să-1 reprezentaţi coincide cu
domeniul tipului YEAR, cel din urmă foloseşte spaţiul într-un mod mai eficient decât SMALLINT. Un alt
avantaj al coloanei YEAR faţă de o coloană cu valori întregi este acela că MySQL va conveni valorile din două
cifre în valori cu patru cifre, folosind regulile obişnuite de „ghicire" a anului din MySQL. De exemplu, 97 şi 14
devin 1997, respectiv 2014. Totuşi, reţineţi că inserţia valorii numerice 00 va avea ca rezultat stocarea valorii
0000, nu a valprii 2000. Dacă doriţi ca o valoare zero să fie convertită la 2000, trebuie să o specificaţi sub formă
deşir: "00".
Atributele coloanelor de tip dată şi oră
Nu există nici un atribut specific coloanelor de tip dată şi oră. Atributele generale NULL sau J NOT NULL pot fi
specificate pentru oricare dintre tipurile dată şi oră. Dacă nu specificaţi nicijj unul din aceste atribute, NULL este
cel prestabilit. De asemenea, puteţi specifica o valoare| prestabilită folosind atributul DEFAULT. Dacă nu
specificaţi o valoare prestabilită, o aseme-| nea valoare va fi aleasă automat. Valoarea prestabilită este NULL
pentru coloanele care pot conţine NULL, în caz contrar, valoarea prestabilită pentru tipul respectiv este „zero".
Lucrul cu coloane de tip dată şi oră
MySQL încearcă să interpreteze valorile de tip dată şi oră într-o varietate de formatei Valorile DATE pot fi
specificate în oricare din următoarele formate, inclusiv formele şir : numerice. Tabelul 2.13 prezintă formatele
permise pentru fiecare dintre tipurile dată şi or
Tabelul 2.13 Formate de intrare pentru coloanele de tip dată si oră Tip
DATETIME, TIMESTAMP
Formate permise
•AAAA-LL-ZZ hh:mm:ss" "AA-LL-ZZ hh:mm:ss" "AAAALLZZhhmmss" " AALLZZhhmmss"
AAAALLZZhhmmss AALLZZhhmmss
Capitolul 2 Lucrul cu date în MySQL şi SQL 131
Tip
DATE
TIME
YEAR
Formate permise
"AAAA-Ll-ZZ"
"AA-LL-ZZ"
"AAAALLZZ"
"AALLZZ"
AAAALLZZ
AALLZZ
"hh:mm:ss"
"hhmmss"
hhmmss
11AA"
AAAA
AA
Formatele cu două cifre pentru valoarea anului sunt interpretate folosind regulile descrise în secţiunea
„Interpretarea valorilor ambigui ale anilor". Pentru formate de tip şir care includ caractere de delimitare, nu
trebuie să folosiţi cratimele pentru date, respectiv caracterul două puncte pentru ore. Ca delimitator poate fi
folosit orice semn de punctuaţie. Interpretarea valorilor depinde de context, nu de delimitator. De exemplu, deşi
orele sunt specificate de obicei folosind delimitatorul două puncte, MySQL nu va interpreta o valoare care
conţine acest caracter ca o oră într-un context unde se aşteaptă o dată. în plus, pentru formatele de tip şir care
includ delimitatori, nu trebuie să specificaţi două cifre pentru valorile lunilor, zilelor, orelor, minutelor sau
secundelor care sunt mai mici decât 10. Următoarele formate sunt toate echivalente între ele:
"2012-02-03 05:04:09" '
"2012-2-03 05:04:09"
"2012-2-3 05:04:09"
"2012-2-3 5:04:09"
"2012-2-3 5:4:09"
"2012-2-3 5:4:9"
Observaţi că valorile cu zerouri iniţiale pot fi interpretate diferit, în funcţie de faptul dacă sunt specificate ca
şiruri sau ca numere. Şirul "001231" va fi văzut ca o valoare cu şase cifre si va fi interpretat sub forma "2000-12-
31" pentru o coloană DATE, respectiv ca " 2000 -12 - 31 00:00:00" pentru o coloană DATETIME. Pe de altă
parte, numărul 001231 va fi asimilat cu 1231 după ce a „trecut" prin analizor, moment după care interpretarea
devine problematică. Aceasta este o situaţie unde cel mai bine este să furnizaţi o valoare de tip şir sau să folosiţi
o valoare complet determinată în cazul în care utilizaţi numere (adică 20001231 pentru DATE, respectiv
200012310000 pentru DATETIME).
în general, puteţi atribui la discreţie valori între tipurile DATE, DATETIME si TIMESTAMP,
deşi trebuie să ţineţi cont de anumite restricţii:
• Dacă repartizaţi o valoare DATETIME sau TIMESTAMP într-o coloană DATE, partea de oră
este eliminată.