PDA

Arată versiune īntreagă : Tipuri de date in MySQL



da alen
13.02.2010, 20:51
Pentru o optimizare a tabelelor din baza de date trebuie folosite tipurile "optime" de date.
De exemplu, daca vrem sa cream un tabel pentru utilizatori, vom avea nevoie de un camp ID cu auto_increment.
Campul respectiv trebuie sa fie numeric.Stim ca tipurile numerice in MySQL sunt:TINYINT, SMALLINT, MEDIUMINT, INT si BIGINT(descrise mai jos).
Tipurile numerice permit atat valori negative cat si valori pozitive.Acestea se stabilesc prin adaugarea proprietatii SIGNED sau UNSIGNED.
Valoarea implicita in MySQL este SIGNED, deci setarea acesteia nu este necesara.Daca este atribuita proprietatea UNSIGNED, campul respectiv va
permite doar valori pozitive.
In concluzie, daca vrem sa cream o coloana pentru id utilizator vom avea doar valori pozitive, deci este necesara proprietatea UNDIGNED.
Puteti intreba "dar de ce sa mai atribui proprietatea respectiva pentru ca oricum vor fi introduse doat valori pozitive?".
Raspunsul este urmatorul:presupunem ca avem un tip TINYINT(acesta permite 256 de numere de la -128 pana la 127);daca nu setam proprietatea UNSIGNED
(sa nu adauge numere negative) vor fi introdusi 127 de utilizatori;utilizatorul cu numarul 128 nu va mai fi introdus.
Atribuind proprietatea UNSIGNED vom obtine 256(inclusiv 0) de valori(adica dublu).
Tipurile numerice permit urmatoarele valori:


-TINYINT de la -128 pana la 256; cu UNSIGNED 256;
-SMALLINT de la -32.768 pana la 32.767; cu UNSIGNED 65.535;
-MEDIUMINT de la 8.388.608 pana la 8.388.607; cu UNSIGNED 16.777.215;
-INT de la -2.147.483.648 pana la 2.147.483.647; cu UNSIGNED 4.294.967.295;
-BIGINT de la -9.223.372.036.854.775.808 pana la 9.223.372.036.854.775.807; cu UNSIGNED :) .

De zici tragem concluzia ca pentru un tabel in care introducem utilizatori, coloana id_utilizator ar trebui sa fie SMALLINT UNSIGNED.
(65.535 de utilizatori).
De ce este bine sa setam tipul optim.Pentru un anumit tip MySQL aloca spatiu pe disc pantru valoarea maxima, deci pierdem spatiu si accesul la date
se face mai greu.
Deci vom crea un tabel utilizatori prin comanda:


CREATE TABLE `utilizatori` (
`id` tinyint unsigned NOT NULL AUTO_INCREMENT,
`nume` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1 ;

Valoarea AUTO_INCREMENT=1 este folsita pentru a incepe incrementarea(numerotarea utilizatorilor) de la 1
Daca reexecutam comanda de mai sus in felul urmator:


CREATE TABLE `utilizatori` (
`id` tinyint unsigned NOT NULL AUTO_INCREMENT,
`nume` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=10 ;
si apoi introducem o valoarea in acest tabel, fara sa specificam id-ul vom observa ca numerotarea va incepe de la 10, urmatorul utilizator primind
valoarea 11.


INSERT INTO `utilizatori` (`id`, `nume`) VALUES
( '','utilizatori');

Incercati sa intoruduceti in tabel o intrare cu id 256(tipul fiind TINYINT).Va fi introdusa valoarea 255 doar in cazul in care aceasta nu exista.
Daca incercati sa introduceti din nou aceasta valoare(255 sau una mai mare de 255) veti primi eroarea "Duplicate entry '255' for key 'PRIMARY'"
deoarece valoarea maxima permisa este deja setata.


INSERT INTO `utilizatori` (`id`, `nume`) VALUES
( '256','utilizatori');

Vom continua cu celelalte tipuri.

da alen
18.02.2010, 14:10
Pentru crearea unei baze date date, prima data este necesar sa identificati tabelele si coloanele de care aceasta va avea nevoie.Dupa identificarea acestora este necesar sa determinam tipul de date pe care il va contine fiecare camp.
Exista trei categorii principale de date:
-text
-numere
-data
Categoria text.
Tipurile de date text sunt:
CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT si LONGTEXT.

Alegerea corecta a tipului afecteaza si performantele aplicatiei pentru care lucrati.
Unele tipuri text accepta parametrul "length", parametru care le limiteaza dimensiunea.
Acest parametru se pune intre paranteze; exemplu CHAR(40).Daca introducem un sir de 42 de caractere intr-un camp CHAR(40), vor fi introduse doar 40 de caractere, ultimele doua fiind trunchiate.
Ca urmare valoarea dintre paranteze va trebui sa corespunda lungimii maxime a sirului din acel camp.
Dimensiunile tipurilor text sunt urmatoarele:

CHAR- de la 0 la 255 de caractere cu o lungime fixa;
VARCHAR- de la 0 la 255 de caractere cu lungime variabila;
TINYTEXT- sir de caractere cu o lungime maxima de 255 de caractere;
TEXT- cu o lungime maxima de 65.535 de caractere;
MEDIUMTEXT- lungime maxima de 16.777.215 caractere;
LONGTEXT-un sir de caractere cu o lungime maxima de 4.294.976.295 caractere.

Atributul "length" este acceptat de tipul CHAR SI VARCHAR.
Principala diferenta intre aceste doua tipuri este ca sirul dintr-un tip CHAR va fi stocat intotdeauna ca un sir cu lungimea maxima a coloanei, folosind spatii pentru completare.
Stim ca un camp parola, criptat md5 va avea intotdeauna 32 de caractere.Daca pentru campul parola stabilim char(40) vor fi introduse 32 de caractere si se va completa cu spatii pana la 40.In schimb pentru tipul VARCHAR, sirul va fi stocat la lungimea reala a lui.
De aici tragem concluzia ca pentru sirurile care vor avea intotdeauna o lungime fixa, trebuie sa folosim tipul CHAR.
Lungimi fixe pot fi:parolele criptate MD5(32 caractere), parola criptate SHA(40 de caractere), anumite abrevieri care au mereu acelasi numar de caractere(cum ar fi indicativul de judet).
Avantajul este ca vor ocupa mai putin spatiu pe disc si accesul la tipul CHAR este mai rapid.
De asemenea, pentru fiecare tip se poate stabili valoare NOT NULL.Valoarea NULL echivaleaza cu faptul ca in acel camp nu exista valoare.
Pentru a forta stocarea unei valori se atribuie NOT NULL coloanei respective.

De aici tragem concluzia urmatoare:
Daca vom crea un tabel pentru utilizatori si avem nevoie de coloanele id, nume, adresa, parola si descriere,
vom stabili urmatoarele valori:id-SMALLINT, nume-VARCHAR(60), adresa-VARCHAR(120), parola md5-CHAR(32) si
descriere-TEXT.



CREATE TABLE `utilizatori` (
`id` SMALLINT NOT NULL ,
`nume` VARCHAR( 60 ) NOT NULL ,
`adresa` VARCHAR( 120 ) NOT NULL ,
`parola` CHAR( 32 ) NOT NULL ,
`descriere` TEXT NOT NULL
) ;