sql - cap 4 new
DESCRIPTION
SQL - Cap 4 NewTRANSCRIPT
InfoAcademy SQL 2015 2
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 2015 3
Tipuri de date MySQL
1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)
2. Temporale
3. Siruri (de octeti, de caractere)
4. Enumerate
InfoAcademy SQL 2015 4
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 pentru numere intregi (limita superioara se dubleaza).
InfoAcademy SQL 2015 5
Numere intregi
Tipuri de date si modificatori specifici
Tip de date SinonimeNr. Octeţi Valori posibile, cu semn
Valori posibile, fara 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 2015 6
„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 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 2015 7
„Lăţimea" unei coloane (continuare)
Atunci cand nu specificam lăţimea unei coloane, 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.
EXEMPLU:
InfoAcademy SQL 2015 8
Modificatorul AUTO_INCREMENT
Adăugat unei coloane cu tip de date numeric, atributul AUTO_INCREMENT 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.
EXEMPLU:
InfoAcademy SQL 2015 9
Numere fractionare
Numere finite, numere infinite – reprezentare trunchiata.
Memorarea numerelor fracţionare 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 2015 10
Tipuri de date MySQL pentru numere in virgula fixa
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))
Tip de date Sinonime Nr. oct. (precizie)
Valori posibile
DECIMAL DECNUMERIC FIXED
1 In funcţie de parametrii specificaţi. Maxim 65 de cifre in total, din care maxim 30 de zecimale.
InfoAcademy SQL 2015 11
Tipuri de date MySQL pentru numere in virgula mobila
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:
Tip de date Sinonime Nr. oct.
(precizie)
Valori posibile cu semn
Valori posibile . unsigned
FLOAT - 4 -3.4xl038...3.4 xl038 0...3.4 x IO38
DOUBLE DOUBLE PRECISION REAL (vezi nota)
8 -1.7 x IO308...1.7 x IO308
(aprox)0...1.7xl0308
(aprox.)
InfoAcademy SQL 2015 12
Tipuri de date MySQL
1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)
2. Temporale
3. Siruri (de octeti, de caractere)
4. Enumerate
InfoAcademy SQL 2015 13
Tipuri de date temporale
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.
Tip de date Valori posibileDATE 1000-01-01 ... 9999-12-31DATETIME 1000-01-01 00:00:00 ... 9999-12-31 23:59:59TIME -838:59:59 ... 838:59:59YEAR 1901 ... 2155 (pt 4 digiti) 1970 ... 2069 (pt 2 digiti)TIMESTAMP 1970-01-01 00:00:01 ... 2038-01-09 03:14:07
InfoAcademy SQL 2015 14
Tipuri de date temporale (continuare)
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 constante 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:89', 1986
- Fiecare dintre tipurile de date temporale dispune de o valoare „zero" a acelui tip de date introdusa automat in modul non-strict. Opţiunea NO_ZERO_DATE – strict.
Tip de date Valori posibileDATE 1000-01-01 ... 9999-12-31DATETIME 1000-01-01 00:00:00 ... 9999-12-31 23:59:59TIME -838:59:59 ... 838:59:59YEAR 1901 ... 2155 (pt 4 digiti) 1970 ... 2069 (pt 2 digiti)TIMESTAMP 1970-01-01 00:00:01 ... 2038-01-09 03:14:07
InfoAcademy SQL 2015 15
Tipuri de date temporale (continuare)
INSERT INTO Date(D DATE, TS TIMESTAMP, T TIME, Y YEAR)
VALUES('2009-04-05', '2006-4-13 18:23:45', '104:56:59', 1986);
Particularitati ale TIMESTAMP (“Unix time”- Numara secundele scurse intre 1 Ian 1970 si 19 Ian 2038 ;- Poate fi folosita optiunea default CURRENT_TIMESTAMP la INSERT;- In consecinta NU va permite NULL automat ca la alte tipuri de date (introduce
timestamp-ul curent), ci doar daca specificam acest lucru explicit;- Poate avea ca modificator ON UPDATE CURRENT_TIMESTAMP (doar pe o col);- Default CURRENT_TIMESTAMP si ON UPDATE CURRENT_TIMESTAMP – sepot
atribui aceeasi coloane. Daca nu sunt specificate sunt implicite pe prima col TS;
InfoAcademy SQL 2015 16
Tipuri de date MySQL
1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)
2. Temporale
3. Siruri (de octeti, de caractere)
4. Enumerate
InfoAcademy SQL 2015 17
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.
InfoAcademy SQL 2015 18
Siruri de octeti
BYNARY – caracteristici:- siruri de lungime fixa (N), specificata in definitia coloanei;- valorile cu lungimi mai mici sunt completate automat cu spatii;- la extragerea unei astfel de valori din tabela, spatiile din final sunt eliminate, de aceea, daca valoarea originala se incheia cu unul sau mai multe spatii, la extragere ea nu le va mai avea.
Tip de date Spaţiu ocupat Nr. maxim de octeţiBINARY(N) N octeţi N (N<=255)VARBINARY(N) Nr. de octeţi al valorii + 1 sau 2 pt lungime N (N<=65535)TINYBLOB Nr. de octeţi al valorii + 1 octet pt lungime 255BLOB Nr. de octeţi al valorii + 2 octet pt lungime 65535MEDIUMBLOB Nr. de octeţi al valorii + 3 octet pt lungime 16,777,215 (16M)LONGBLOB Nr. de octeţi al valorii + 4 octet pt lungime 4,294,967,295 (4G)
InfoAcademy SQL 2015 19
Siruri de octeti (continuare)
VARBYNARY – caracteristici:- lungime maxima (N), specificata in definitia coloanei;- valorile sunt memorate in tabela exact cum sunt introduce plus 1-2 octeti;- creste eficienta utilizarii spatiului pe HDD;- dispare problema cu spatiile prezenta la datele de tip BYNARY (spatiile de la final vor fi pastrate).
Tip de date Spaţiu ocupat Nr. maxim de octeţiBINARY(N) N octeţi N (N<=255)VARBINARY(N) Nr. de octeţi al valorii + 1 sau 2 pt lungime N (N<=65535)TINYBLOB Nr. de octeţi al valorii + 1 octet pt lungime 255BLOB Nr. de octeţi al valorii + 2 octet pt lungime 65535MEDIUMBLOB Nr. de octeţi al valorii + 3 octet pt lungime 16,777,215 (16M)LONGBLOB Nr. de octeţi al valorii + 4 octet pt lungime 4,294,967,295 (4G)
InfoAcademy SQL 2015 20
Siruri de octeti (continuare)
Tipurile de date BLOB (Binary Large Object)– caracteristici:- accepta valori cu lungime variabila, asemanatoare cu VARBINARY, dar cu
valori posibile mult mai mari;- fiecare valoare va ocupa numarul de octeti corespunzator plus 1-4 octeti pentru mentionarea lungimii.
Tip de date Spaţiu ocupat Nr. maxim de octeţiBINARY(N) N octeţi N (N<=255)VARBINARY(N) Nr. de octeţi al valorii + 1 sau 2 pt lungime N (N<=65535)TINYBLOB Nr. de octeţi al valorii + 1 octet pt lungime 255BLOB Nr. de octeţi al valorii + 2 octet pt lungime 65535MEDIUMBLOB Nr. de octeţi al valorii + 3 octet pt lungime 16,777,215 (16M)LONGBLOB Nr. de octeţi al valorii + 4 octet pt lungime 4,294,967,295 (4G)
InfoAcademy SQL 2015 21
Ş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).
Lista completa poate fi obtinuta cu comanda: SHOW CHARACTER SET (CHARSET).Lista prezinta si collation-ul implicit si numarul maxim de octeti ocupat.
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
InfoAcademy SQL 2015 22
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 2015 23
Tipuri de date MySQL pentru siruri de caractere
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;
Tip de date Numar maxim de caractereCHAR(N) N (N<=255)VARCHAR(N) N (N<=65535)TINYTEXT 255TEXT 65535MEDIUMTEXT 16,777,215 (16M)LONGTEXT 4,294,967,295 (4G)
InfoAcademy SQL 2015 24
Tipuri de date MySQL
1. Numerice (intregi, zecimale, vigula fixa, virgula mobila)
2. Temporale
3. Siruri (de octeti, de caractere)
4. Enumerate
InfoAcademy SQL 2015 25
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 2015 26
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 2015 27
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.
CREATE TABLE Prezenta(ID INT(10), Perioada SET('dimineata', 'pranz', 'seara'));
INSERT INTO Prezenta VALUES(4, 'pranz,seara')
InfoAcademy SQL 2015 28
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 sub forma unui intreg corespunzator.
Valorile sunt numerotate de la 1 (dimineata – 1, pranz – 2, seara – 3).
Valoarea intreaga corespunzatoare conteaza atunci cand coloanele de tip ENUM/SET intervin in expresii in contexte numerice.
Exemplu: