Sunteți pe pagina 1din 35

Cap 4.

Tipuri de date MySQL


Consecinţele alegerii unui tip de date

Criterii de avut in vedere:

- domeniul de valori posibile pentru acea coloana;

- precizia dorita;

- spaţiul ocupat pe hard-disk;

- performanta DBMS in lucrul cu acel tip de date;

InfoAcademy SQL 2017 2


Tipuri de date MySQL

1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)

2. Temporale

3. Siruri (de octeti, de caractere)

4. Enumerate

InfoAcademy SQL 2017 3


Tipuri de date numerice

Proprietati generale:

Tipurile de date MySQL permit memorarea următoarelor tipuri de numere:

- intregi (numere fara parte zecimala);

- raţionale. Acestea pot fi memorate in virgula fixa sau in virgula mobila. Stocarea
unora dintre numere in baza de date este subiect de trunchiere/rotunjire;

Datele numerice sunt implicit cu semn, avand domeniul simetric in jurul lui zero.

Daca specificam modificatorul UNSIGNED valorile devin pozitive. Plaja de valori se


dubleaza doar pentru numere intregi (limita superioara se dubleaza).

InfoAcademy SQL 2017 4


Numere intregi

Tipuri de date si modificatori specifici

Nr. Valori posibile, fara semn


Tip de date Sinonime Octeţi Valori posibile, cu semn (unsigned)

TINYINT - 1 -128...127 0...255

SMALLINT 2 -32768...32767 0...65535

MEDIUMINT - 3 -8388608...8388607 0...16777215

INT INTEGER 4 -2147483648...2147483647 0... 4294967295

BIGINT - 8 (aprox) -9xl018...9xl018 0...18xl018


InfoAcademy SQL 2017 5
„Lăţimea" unei coloane

In definiţia unei coloane cu tip de date intreg se poate specifica, opţional,


„lăţimea" coloanei - numărul de caractere returnat de MySQL atunci cand se extrag date
de pe acea coloana - prin plasarea sa intre paranteze imediat dupa tipul de date:

Interfon INT(3)

Lăţimea NU afectează nici domeniul de valori posibile, nici spaţiul de stocare


ocupat in cazul tipurilor de date pentru NUMERE INTREGI:
In exemplul de mai sus, valoarea 124 va fi afişată ca atare, valoarea 12345 va fi si
ea memorata si afişată ca atare, iar valoarea 12 va fi completata la stânga cu spatii
inaintea afişării.

InfoAcademy SQL 2017 6


„Lăţimea" unei coloane (continuare)

Atunci cand nu specificam lăţimea unei coloane pentru NUMERE INTREGI,


MySQL alege automat aceasta valoare astfel incat sa cuprindă valoarea cea mai lunga a
acelui tip de date (inclusiv eventualul semn minus).
Spre exemplu, o definiţie de coloana

Nr TINIYINT va avea o latime implicita de 4 (3 cifre plus semn).

Modificatorul ZEROFILL va face ca valorile sa fie completate cu cifre 0 in loc de


spatii atunci cand au număr de caractere mai mic decât lăţimea coloanei. Acest
modificator solicita automat si UNSIGNED.

InfoAcademy SQL 2017 7


Modificatorul AUTO_INCREMENT

Adăugat unei coloane cu tip de date numeric, atributul AUTO_INCREMENT (AI)


insereaza o noua valoare numerica egala cu valoarea maxima existenta plus unu.

- O tabela SQL poate avea o singura coloana de tip AUTO_INCREMENT si acea


coloana trebuie declarata ca index (UNIQUE sau PRIMARY KEY);
- Atentie, AI “tine minte” intotdeauna ce valoare urmeaza, nu umple eventuale
goluri ramase de la stergerea unor inregistrari;
- Poate incepe de la 1 (implicit) sau de la o valoare setata de noi la crearea tabelei
(dupa definitiile de coloane);
- Valoarea care urmeaza poate fi modificata cu ALTERE TABLE;

InfoAcademy SQL 2017 8


Numere rationale

Numere finite, numere infinite – reprezentare trunchiata.

Memorarea numerelor rationale intr-un sistem de calcul se poate face in doua moduri:
- in virgula fixa - presupune stabilirea de la bun inceput a numărului de zecimale;

- in virgula mobila - poziţia virgulei in cadrul numărului nu mai este prestabilita, ci poate varia in
funcţie de valoarea memorata. Numărul total de cifre ce pot fi memorate ramane acelaşi, insa
prin schimbarea poziţiei virgulei pot fi obţinute numere de diferite anverguri si precizii.

Caracteristici:
- In virgula fixa stabilim de la inceput numarul de zecimale, respectiv pozitia virgulei;
- In cazul virgulei mobile putem muta virgula atat la dreapta cat si la stanga;
- In virgula fixa memoram valoarea exacta asteptata (finita sau rotunjita);
- In virgula mobila memoram valori aproximative dar avem viteza de calcul sporita;

InfoAcademy SQL 2017 9


Tipuri de date MySQL pentru numere in virgula fixa

Tip de date Sinonime Nr. oct. Valori posibile


(precizie)
DECIMAL DEC 1 In funcţie de parametrii specificaţi. Maxim 65 de
NUMERIC cifre in total, din care maxim 30 de zecimale.
FIXED
Caracteristici:
- Exista un singur tip de date in virgule fixa: DECIMAL;
- Se configureaza doi parametri: numarul total de cifre admise si numarul de
zecimale;
- Separatorul zecimal si eventualul semn minus nu se iau in calcul;
- Daca incercam sa introducem valori mai mari in sql_mode strict vom avea o
eroare, in modul nonstrict valoarea va fi trunchiata la valoarea maxima admisa;

CREATE TABLE Produse (Denumire VARCHAR(100), Pret DECIMAL(5,2))


InfoAcademy SQL 2017 10
Tipuri de date MySQL pentru numere in virgula mobila
Valori posibile Valori posibile
Tip de date Sinonime Nr. oct. cu semn . unsigned
(precizie)
FLOAT - 4 -3.4xl038...3.4 xl038 0...3.4 x IO38
DOUBLE DOUBLE PRECISION 8 -1.7 x IO308...1.7 x IO308 0...1.7xl0308
REAL (vezi nota) (aprox) (aprox.)
REAL este implicit sinonim pentru DOUBLE; daca insa se foloseşte in sql_mode
opţiunea REAL_AS_FLOAT, REAL devine sinonim pentru FLOAT

CREATE TABLE Persoane (Nume VARCHAR(100), Greutate FLOAT(5,2))

Exemplu:

InfoAcademy SQL 2017 11


Tipuri de date MySQL

1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)

2. Temporale

3. Siruri (de octeti, de caractere)

4. Enumerate

InfoAcademy SQL 2017 12


Tipuri de date temporale
Tip de date Valori posibile
DATE 1000-01-01 ... 9999-12-31
DATETIME 1000-01-01 00:00:00 ... 9999-12-31 23:59:59
TIME -838:59:59 ... 838:59:59
YEAR 1901 ... 2155 (pt 4 digiti) 1970 ... 2069 (pt 2 digiti)
TIMESTAMP 1970-01-01 00:00:01 ... 2038-01-09 03:14:07
Caracteristici:
- data calendaristica - tipul de date DATE sub forma AAAA-LL-ZZ;
- moment in timp (data calendaristica+ora) - tipul de date DATETIME. Formatul
este AAAA-LL-ZZ 00:MM:SS;
- TIMESTAMP - asemanator DATETIME, poate memora automat timpul curent la
INSERT sau UPDATE, folosind atributul ON_UPDATE_CURRENT_TIMESTAMP.

InfoAcademy SQL 2017 13


Tipuri de date temporale (continuare)
Tip de date Valori posibile
DATE 1000-01-01 ... 9999-12-31
DATETIME 1000-01-01 00:00:00 ... 9999-12-31 23:59:59
TIME -838:59:59 ... 838:59:59
YEAR 1901 ... 2155 (pt 4 digiti) 1970 ... 2069 (pt 2 digiti)
TIMESTAMP 1970-01-01 00:00:01 ... 2038-01-09 03:14:07

Caracteristici (continuare):
- interval de timp - tipul de date TIME, care poate fi folosit pentru a reprezenta atat ora din
zi, cat si intervale de timp care pot fi mai mari de 24h. Formatul este 00:MM:SS sau
000:MM:SS;
- an - tipul YEAR, pe 2 sau pe 4 digiti;
- valorile pentru coloane se specifica incadrate in apostroafe, cu excepţia tipului YEAR
reprezentat ca intreg. Lunile sau zilele care au o singura cifra nu este obligatoriu sa aiba 0
in fata. Ex: '2006-4-13 18:23:45', '104:56:59', 1986

InfoAcademy SQL 2017 14


Tipuri de date MySQL

1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)

2. Temporale

3. Siruri (de octeti, de caractere)

4. Enumerate

InfoAcademy SQL 2017 15


Tipuri de siruri

MySQL oferă utilizatorului posibilitatea de a lucra cu doua tipuri de şiruri:

- şiruri de octeţi - sunt simple succesiuni de numere. Compararea a doua astfel de şiruri se
efectuează numeric, octet cu octet;

- şiruri de caractere - un sir de caractere diferă fundamental de unul de octeţi prin


următoarele aspecte:
- un caracter poate fi reprezentat pe unul sau mai mulţi octeţi (spre exemplu, un sir
de 3 caractere poate avea chiar 9 sau mai mulţi octeţi). Ca o consecinţa, compararea a doua
şiruri de caractere nu mai poate fi făcuta comparând octeţii componenţi unul cate unul, ci
trebuie ţinut cont de caracterele pe care le reprezintă diversele grupuri de octeţi;
Exemplu: Ţâr care in reprezentare UTF8 are 5 octeţi: (197,162 ; 195, 162 ; 114)
(http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec&unicodeinhtml=dec )
- un sir de caractere are asociate doua proprietăţi care nu se regăsesc la şirurile de
octeţi: character set si collation. Prima stabileşte setul de caractere ce pot fi folosite in
cadrul şirului, iar cea de-a doua modalitatea de comparare a caracterelor din acel set. 16
InfoAcademy SQL 2017
Şiruri de caractere
Character set

Character set reprezinta o lista de caractere posibile, fiecare in corespondenta cu un cod


numeric.
- unele seturi sunt reprezentate pe un singur octet (ASCII);
- altele pe 2 octeti - lungime fixa – (UCS2);
- altele ocupa 1-4 octeti – lungime variabila – (UTF8, UTF16, UTF32, UTF8MB4).
Set de caractere Descriere
ASCII Folosit in engleza americana; fiecare caracter are 7 biti (codurile au valori <128)
ISO-8859-2 (latin2) Caracterele folosite in zona central si est europeana (inclusiv România)
UCS2 Conţine majoritatea caracterelor Unicode, codul fiecărui caracter având 2 octeţi
UTF8 Character set pentru Unicode, cu fiecare caracter ocupând intre 1 si 4 octeţi

Lista completa poate fi obtinuta cu comanda: SHOW CHARACTER SET (CHARSET).


InfoAcademy SQL 2017 17
Collation
Collation reprezinta setul de reguli specific utilizat la compararea caracterelor
componente.
- literele mici si mari pot fi considerate sau nu echivalente (case sensitive/insensitive);
- literele cu accent sau diacritice pot fi sau nu echivalente;
- un character set poate avea unul sau mai multe collation, dar un sir de caractere poate avea
un singur collation;
- doua seturi diferite de caractere nu pot avea acelasi collation;

Denumirea fiecarui collation este de tipul: numecharset_referinta_tip.


Referinta poate fi: general, numele tarii pentru care se aplica, etc.
Tipul poate fi:
- _ci - case-insensitive;
- _cs - case sensitive;
- _bin - binary (comparate exclusive pe baza codului lor, toate fiind diferite intre ele.
Se pot define valori implicite de charset/collation la nivel de server, BD si tabela.
InfoAcademy SQL 2017 18
Tipuri de date MySQL pentru siruri de caractere
Tip de date Numar maxim de octeti
CHAR(N) N (N<=255)
VARCHAR(N) N (N<=65535)
TINYTEXT 255
TEXT 65535
MEDIUMTEXT 16,777,215 (16M)
LONGTEXT 4,294,967,295 (4G)
Caracteristici:
- similar ca la sirurile de octeti CHAR are lungime fixa completata cu spatii;
- celelalte au lungime variabila plus octetii pentru lungime;
- un caracter poate ocupa mai multi octeti;
- la definirea unei coloane de tip sir de caractere se specifica lungimea, charset-ul si
collation;
SHOW CHARACTER SET;
SHOW COLLATION; InfoAcademy SQL 2017 19
Tipuri de date MySQL

1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)

2. Temporale

3. Siruri (de octeti, de caractere)

4. Enumerate

InfoAcademy SQL 2017 20


Tipuri de date enumerate

Coloana de acest tip poate lua valori doar dintr-o multime fixa de valori distincte. MySQL
dispune de doua tipuri de astfel de date:

- ENUM
- contine valori dintr-o multime prestabilita, specificata in definitia coloanei;
- fiecare inregistrare va avea una din valorile din lista, sau NULL, daca este permis;
- pot fi definite maxim 65535 de valori distincte

CREATE TABLE Prezenta(


ID INT(10),
Perioada ENUM('dimineata', 'pranz', 'seara')
);
INSERT INTO Prezenta VALUES(3, 'pranz')

InfoAcademy SQL 2017 21


Tipuri de date enumerate (continuare)

Atunci cand coloana in cauza permite NULL, valoarea default a coloanei va fi NULL. In
caz contrar, daca nu se specifica explicit valoarea default la crearea coloanei, in
modul non-strict va fi folosit implicit primul element din lista de valori permise.

Atunci cand pe o coloana de tip ENUM se introduce o valoare invalida (alta decat
cele din lista permisa) si serverul functioneaza in modul non-strict, valoarea
memorata in baza de date va fi '' (sirul vid) pentru a indica eroarea. Aceastei valori
particulare ii corespunde codul 0

InfoAcademy SQL 2017 22


Tipuri de date enumerate (continuare)

- SET
- asemanator cu ENUM, in plus permite o combinatie de valori;
- pot fi definite maxim 64 de valori distincte;
- valoarea '' (sirul vid) este una valida in cazut acetui tip de date, asemenator ENUM.

CREATE TABLE Prezenta(


ID INT(10),
Perioada SET('dimineata', 'pranz', 'seara')
);
INSERT INTO Prezenta VALUES(4, 'pranz,seara')

InfoAcademy SQL 2017 23


In instructiunile MySQL, valorile de tip ENUM sau SET sunt reprezentate ca
stringuri, incadrate intre apostroafe.

Stocarea lor in baza de date se face insa eficient: fiecare valoare a unui tip de
date enumerat este memorata de catre MySQL astfel:
- sub forma unui intreg incepand de la 1 si pana la numarul de elemente
existente, in cazul ENUM;
- sub forma unui intreg corespunzator puterilor lui 2, de la 0 la numarul de
elemente, in cazul SET.

Valoarea intreaga corespunzatoare conteaza atunci cand coloanele de tip


ENUM/SET intervin in expresii in contexte numerice.

Exemplu:

InfoAcademy SQL 2017 24


EXPRESII SQL

1. Compozitia unei expresii

2. Reprezentarea valorilor constante in instructiuni MySQL

3. Operatori

InfoAcademy SQL 2017 25


Compozitia unei expresii

O expresie SQL poate fi compusa din:


- Valori constante, specificate ca atare in cadrul instructiunii SQL
(numere, siruri, date calendaristice, etc.);
- Valori ale coloanelor din tabelele care intervin in instructiuni cu numele lor;
- Apeluri catre functii SQL predefinite sau functii create de utilizator;
- NULL.

Expresiile pot fi intalnite in:


- valorile coloanelor returnate de catre instructiunea SELECT (SELECT salariu*12);
- valorile introduse pe coloane cu instructiunea UPDATE (UPDATE t SET col1=col1+5);
- criteriile de ordonare din clauza ORDER BY (ORDER BY CONCAT(nume, ‘ ‘, prenume);
- conditiile din clauza WHERE (WHERE salariu >1000 AND SALARIU <2000).

Toate acestea pot fi combinate de operatori, care acepta unul sau mai multi operanzi
InfoAcademy SQL 2017 26
EXPRESII SQL

1. Compozitia unei expresii

2. Reprezentarea valorilor constante in instructiuni MySQL

3. Operatori

InfoAcademy SQL 2017 27


Reprezentarea numerelor Exercitiul 5.011

Reguli:
- In baza 10 numerele pot fi scrise astfel: 60, -25, +17;
- In hexazecimal pot fi scrise astfel:
- x’valoare’ Ex. x’DA’ = 13*16+10 = 218
- X’valoare’ Ex. X’58’ = 5*16+8 = 88
- 0xvaloare Ex. 0x2aF = 2*16*16+10*16+15 = 687
- Valoare utilizeaza cifre de la 0-9 si litere de la A la F, case insensitive, + sau -
- Numerele fractionare, pot fi precedate de semn si reprezentate astfel:
- In notatie fractionara obisnuita(dec) Ex. 43.8
- In notatie stiintifica(vm) Ex. 0.438e2 = 43.8 sau 438e-1

- Reprezentarea sirurilor de caractere, datelor de tip temporar, ENUM,


SET este identica cu cea de la definitiile de coloane

InfoAcademy SQL 2017 28


EXPRESII SQL

1. Compozitia unei expresii

2. Reprezentarea valorilor constante in instructiuni MySQL

3. Operatori

InfoAcademy SQL 2017 29


Operatori aritmetici Exemplul 5.041

- + adunare
- - scadere
- * inmultire
- / impartire – poate rezulta un numar fractionar
- DIV impartire intreaga – returneaza catul impartirii primului operand la al doilea
- % modulo – returneaza restul impartirii primului operand la al doilea

Operatorii aritmetici + si – pot fi aplicati si valorilor de tip temporar,


adaugand/scazand un interval de timp dintr-o data existenta.

Se utilizeaza cuvantul cheie INTERVAL urmat de o expresie (valoare) si de unitatea de


masura (YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND).

InfoAcademy SQL 2017 30


Operatori de comparare Exemplul 5.051

Accepta unul sau mai multi operanzi si returneaza 0, 1 sau NULL.


Pot compara inclusive siruri de caractere.

- > mai mare < mai mic


- >= mai mare sau egal <= mai mic sau egal
- = egal <> sau != diferit de

- IS NULL IS NOT NULL


- <=> verifica egalitatea, chiar si pentru NULL # pt NULL nu folosim egal

- Operand [NOT] BETWEEN valoare1 AND valoare2 (inclusive capetele interval)


- Expresie1 [NOT] LIKE ‘expresie2’ (putem utiliza “_” si “%”)
- Expresie [NOT] IN (val1, val2,…), echivalenta cu expr1=val1 OR expr1=val2…

InfoAcademy SQL 2017 31


Operatori logici Exemplul 5.061

- AND sau && - SI logic

- OR sau || - SAU logic

- XOR - SAU exclusive a XOR b = a AND (NOT b)) OR ((NOT a) and b)

- NOT sau ! - negare, inversarea valorii de adevar

InfoAcademy SQL 2017 32


Operatori de evaluare conditionata Exemplul 5.071
CASE expresie
WHEN expresie1 THEN valoare1
WHEN expresie2 THEN valoare2
....................
[ELSE] valoare_default
END
Exemplul 5.071
CASE
WHEN expresie1 THEN valoare1
WHEN expresie2 THEN valoare2
....................
[ELSE] valoare_default
END
In ambele cazuri expresiile sunt evaluate cronologic. La prima iteratie adevarata
se iese din CASE si celelalte iteratii nu se mai verifica.
InfoAcademy SQL 2017 33
Operatori de conversie Exemplul 5.081

Operatorul BYNARY – face ca un sir de caractere sa fie tratat ca un sir de octeti.

SELECT BYNARY col1, col2,… FROM tabela;

Conversii de tip de date implicite Exemplul 5.091

Atunci cand operanzii unui operator au tip de date diferit MySQL procedeaza astfel:
- Numerele sunt transformate automat in siruri de caractere si invers, unde este
necesar;
- Datele de tip temporal sunt convertite la numere cand sunt folosite intr-un context
numeric, si invers;
- Valorile coloanelor de tip enumerat sunt automat convertite la string sau la număr in
funcţie de context;

InfoAcademy SQL 2017 34


Recapitulare expresii, constante, operatori

Constante: reprezentarea in hexazecimal, notatia stiintifica;

Com sunt tratate constantele ca tip de date (intregi, stiintifice, fractionare)?

Operatori : %, DIV, XOR, BINARY, CASE;

Calculati momentul de fata plus 10 zile, 59 minute, 59 de secunde;

Vrem sa comparam daca doua expresii sunt NULL (ambele). Ce operator folosim?

Vrem sa facem o selectie care sa includa si inregistrarile cu NULL. Ce operator folosim?

Avem doua coloane c1 si c2 cu valorile ‘Cirese’ si ‘CiReSe’. Care este valoarea de


adevar a expresiei: c1=c2?
InfoAcademy SQL 2017 35

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