Mysql Tutorial
Mysql Tutorial
Instalare MySQL sub Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Instalare Apache sub Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Instalare PHP sub Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Instalare MySQL sub Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Instalare PHP/Apache sub Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Conectarea la server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Privilegiile utilizatorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Crearea bazelor de date si a tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Tipuri de campuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Inserarea de inregistrari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Actualizarea inregistrarilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Extragerea inregistrarilor cu SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Join-uri intre tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Stergerea inregistrarilor si a tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Crearea indecsilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27 Modificarea tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Siruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29 Numere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Numele folosite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Variabile definite de utilizator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Comentarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Cuvinte rezervate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Functii pentru compararea de siruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32 Functii matematice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Functii pentru siruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Functii pentru date si timp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Functii diverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Sintaxa completa a celor mai folosite comenzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Administrarea utilizatorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41 Controlul accesului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Comezile GRANT si REVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Backup-ul bazelor de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Securitatea datelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 Optimizarea MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46
Schimbarea setului de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Mesaje de eroare in romana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Utilitarele MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 mysqladmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 mysqldump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 mysqlimport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Crearea tabelelor cu PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Conectarea la baza de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Deschiderea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Executia comenzilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Adaugarea de inregistrari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Formulare HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Afisarea inregistrarilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54 Actualizarea inregistrarilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Functiile PHP pentru lucrul cu MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Aplicatiile Web sunt prezentul si viitorul. Orice limbaj de programare ai fi facut in trecut, sau daca stii numai HTML, CV-ul tau va fi vazut altfel cu experienta in dezvoltarea aplicatiilor Web. La nivel cel mai de jos World Wide Web-ul se bazeaza pe o arhitecura client/server. Asta insemna ca si severul central dar si aplicatia-client sunt responsabile de o parte din procesarea datelor. Clientul Aplicatiile care se pot dezvolta folosind MySQL si PHP folosesc un singur client: browser-ul Web. Unele aplicatii mai sofisticate pot folosi si un applet Java (spre exemplu un client de chat in timp real). Singurul client de care trebuie sa fii preocupat este browser-ul care va interpreta aplicatiile tale. Server-ul Aproape tot ce fac aplicatiile Web are loc pe un server. O aplicatie specifica, numita server Web, va fi responsabila pentru comunicarea cu browser-ul. In cele din urma, mai este nevoie de un limbaj care sa intermedieze cereri intre server-ul web si un server de baze de date, in cazul nostru si sa realizeze sarcini prin program asupra informatiilor ce vin si se duc spre sever-ul Web. Toate aceste trei elemente (server-ul Web, limbajul de programare si serverul de baze de date) trebuie sa fie compatibile si cu sistemul de operare din calculatorul pe care sunt folosite. Cele mai folosite sisteme de operare pe serverele Web sunt Windows NT/2000 si UNIX (peste 90% din numarul total de servere de pe Web). Ce ar trebui sa folosesti pentru aplicatii Web ? Ei bine, foarte pe scurt PHP si MySQL sunt produse gratuite, spre deosebire de celelate optiuni gratuitatea nu inseamna ca nu au aceleasi performante ca sistemele de mii de dolari. Windows NT sau Windows 2000 este o buna alegere, dar poti folosi MySQL si PHP si pe Windows 95/98/Me. Cu toate acestea, in lumea de afara aproape toate aplicatiile PHP/MySQL ruleaza pe o versiune de UNIX: Linux, Irix, Solaris, HP-UX.. Server-ul Web Cele mai folosite servere Web sunt Apache si Microsoft's IIS. Apache este si el gratuit si in sistem Open Source ca si PHP, MySQL si Linux. El functioneaza bine pe un sistem UNIX dar si pe un sistem Windows (dar nu pe un server foarte incarcat). Cea mai buna alegere este realizarea si testarea aplicatiei pe Windows cu Apache, PHP si MySQL si apoi transferul aplicatiei pe un server Linux fara schimbari in script-uri. Middleware 3
PHP face parte din clasa limbajelor middleware (ASP, Perl, ColdFusion etc.). Aceste limbaje lucreaza cu serverul Web pentru a interpreta cererile facute din dinspre World Wide Web, proceseaz aceste cereri, interactioneaza cu alte programe pe server pentru a indeplini cererile si va indica, apoi, server-ului exact ceea ce trebuie servit browser-ului clientului. Limbajul middleware va fi folosit pentru marea majoritate din munca ta. O tranzactie normala cu baza de date Web se constituie din urmatorii pasi (numerotati in figura):
1. Browser-ul unui utilizator face o cerere HTTP pentru o anumita pagina (spre exemplu se cauta o anumita carte un site prin intermediul fisierului results.php). 2. Server-ul Web primeste cererea pentru results.php, cauta fisierul si il paseaza motorului PHP pentru a fi procesat. 3. Motorul PHP incepe procesarea si gaseste o comanda de conectare la o baza de date si o interogare dupa un anumit criteriu. PHP deschide o conexiune cu server-ul MySQL si ii trimite interogarea. 4. Server-ul MySQL primeste interogarea si o proceseaza si trimite rezultatul (o lista de carti, in cazul nostru) PHP-ului. 5. PHP-ul termina de rulat script-ul (de obicei are loc o formatare a rezultatelor interogarii in HTML) si returneaza fisierul HTML rezultat server-ului Web 6. Server-ul Web trimite HTML-ul inapoi catre browser de unde utilizatorul poate vedea lista cartilor pe care le-a cerut.
Daca ai un calculator, Linux, Apache si PHP sunt absolut gratuite. La fel si MySQL cu unele limitari. PHP si MySQL pot fi folosite pe majoritatea platformelor. Desi MySQL nu dispune de toate caracteristicile suportate de concurenta, este la fel de rapid si de puternic. Conectivitatea, viteza si securitatea face server-ul MySQL extrem de potrivit pentru accesarea bazelor de date pe Internet. PHP a reusit sa ajunga la mix-ul perfect de putere, rapiditate, structura si usurinta in folosire. Si PHP si MySQL sunt imbunatatite in mod constant
Ce este MySQL ? MySQL este un server SQL pentru baze de date foarte robust, rapid, multi-utilizator, multi-thread. MySQL este un sistem de gestiune a bazelor de date. O baza de date este o colectie strucurata de date. Ca sa adaugi, sa accersezi si sa procesezi informatiile din baza de date ai nevoie de un sistem de gestiune a bazelor de date ca, de exemplu MySQL. MySQL este un sistem de gestiune a bazelor de date relationale. O baza de date relationala memoreaza date in tabele separate in loc de a stoca toate informatiile intr-o singura structura adaugand astfel viteza si flexibilitate. Tabelele sunt legate prin relatii permitandu-se
afisarea datelor combinate la cerere. Sistemele de gestiune a bazelor de date relationale (SGBDR) ofera o cale excelenta pentru a stoca si a accesa informatii complexe. Cele mai populare SGBDR-uri sunt Oracle, Infomix, Microsoft's SQL Server, IBM's db2 si SGBD-uri "open-souce": MySQL, Postgres si Interbase.
Baze de date relationale Tabele Tabela are un nume, un numar de coloane corespunzatoare tipurilor de informatii si linii corespunzatoare inregistrarilor din tabele. De exemplu:
CLIENTI ID 1 2 3 Nume Adresa Oras Julie Smith 25 Oak Street London Alan Wong 47 Haines Avenue New York Michelle Arthur 357 North Road Chicago
Coloanele au un nume unic si contin informatii diferite. Fiecare are un tip de date asociat (de exemplu, integer pentru 'ID' si string pentru 'Nume', 'Adresa' si 'Oras'). Coloanele mai sunt numite campuri sau atribute. Liniile reprezinta cate un client diferit in tabela noastra. Mai sunt numite inregistrari sau tupluri. Valorile specificate la intersectia coloanelor cu liniile trebuie sa aiba tipul de date corespunzator. Cheile reprezinta o cale de a identifica fiecare inregistrare in parte. Baze de date care au mai multe tabele folosesc o cheie primara sau o cheie externa(Primary Key sau Foreign Key ) ca referinta de la o tabela la alta. Daca adaugam o noua tabela cu comezile facute de clienti, putem face legatura intre cele doua tabele pe baza campului comun 'ID' care este PK in tabela 'clienti' si FK in 'comenzi':
COMENZI ComID ID 1 2 3 4 Cantitate 3 30.66 1 23.00 2 5.00 4 40.87
Relatie una-la-una - Exista cate una/unul din fiecare in relatie (dcaca am fi pus adresele intr-o tabela separata intre CLIENTI si ADRESE ar fi existat un corespondent pentru fiecare inregistrare). Relatie una-la-mai-multe - O linie dintr-o tabela e legata la mai multe linii din alta tabela (un client ar putea face mai multe comenzi). Relatie mai-multe-la-mai-multe - Mai multe linii din tabela 1 sunt legate la mai multe din tabela 2 (de exemplu, in cazul a doua tabele, CARTI si AUTORI, o carte ar putea fi scrisa de doi coautori, fiecare dintre ei mai avand si alte carit scrise).
1. Gandeste-te la obiectele reale pe care le modelezi. 2. Evita sa stochezi informatiile care sunt redundante. 3. Foloseste valori "atomice" in coloanele tabelei (adica nu memora valori multiple in cadrul aceluiasi camp al tabelei). 4. Alege chei foarte sensibile, care pot identifica unic o inregistrare. 5. Gandeste-te la ce vrei sa ceri prin interogari din baza de date si include informatii aditionale. 6. Evita sa folosesti prea multe atribute nule (coloane din inregistrari fara continut).
MySQL este disponibil pentru Windows, Linux si alte variante de Unix. Se poate copia de la site-ul MySQL: www.mysql.com. Versiunea Windows are un nume asemanator cu mysql-shareware-x_xx_xxwin.zip (unde 'x' este versiunea. Download-ul RPM este cel recomandat pentru versiunea Linux. Pachetul MySQL este compus din:
Serverul MySQL : Este inima MySQL-ului (programul care se ocupa cu bazele tale de date). Programe-client MySQL: Cel mai folosit este mysql.exe care ofera o interfata prin care se pot inteorga bazele da date pentru a afla informatiile dorite din baza de dateMySQL comes with many client programs. The one with which we'll be dealing a lot is called mysql (note: smallcaps). This provides an interface through which you can issue SQL statements and have the results displayed. Libraria-client MySQL: Ajuta la scrierea programelor client in C.
Diferenta dintre MySQL si mysql MySQL se refera la toata pachetul de distributie MySQL, in timp ce mysql este doar un program-client.
Instalare pe Windows
Trebuie sa ai instalat protocolul TCP/IP (e pe CD-ul cu Windows) si libraria Winsock 2 (Windows 95 nu-l are!!) ca sa mearga MySQL. Pentru a instala pachetul copiat, dezarhiveaza-l intr-un director temporar si ruleaza Setup.exe. Implicit MySQL-Windows se va instala in `C:\mysql'. Daca vrei sa-l instalezi in alt director, instaleaza-l mai intai in `C:\mysql' si apoi muta-l unde vrei, trebuind apoi sa specifici programului cand il startezi noua cale cu comanda:
C:\> D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql
Copiaza fisierul C:\mysql\my-xxxxx.cnf in C:\my.cnf si modifica optiunile implicite ale serverului dupa preferinte (vezi sectiunea de "Administrare MySQL"). Instalarea e acum completa. Pentru a testa daca MySQL merge incepe o sesiune MS-DOS (in casuta Start menu-Run tasteaza command) in directorul c:\mysql\bin si scrie urmatoarea comanda:
mysqld-shareware --standalone
Se va porni serverul MySQL. Tasteaza mysql si promptul se va schimba in mysql. Tasteaza show databases si ar trebui sa obtii urmatorul rezultat:
+----------------+ | Database | +----------------+ | mysql | | test | +----------------+ 2 rows in set (0.00 sec)
Acum vei adauga o parola pentru utilizatorul root in locul utilizatorului anonim care poate fi folosit de oricine:
C:\> C:\mysql\bin\mysql mysql< mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> QUIT C:\> C:\mysql\bin\mysqladmin reload C:\> C:\mysql\bin\mysqladmin -u root password your_password
Windows 95/98 Versiunea de MySQL pentru Windows 95/98 are doua versiuni de servere: mysqld si mysqld-opt, optimizat pentru procesoare Pentium. Poti starta serverul cu comanda:
C:\mysql\bin\mysqld-opt
Windows NT/Win2000 Serviciul e instalat cu numele MySQL si trebuie pornit din Services Control Manager (SCM) Utility din Control Panel. Poti configura serverul MySQL sa relueze ca serviciu prin:
C:\mysql\bin\mysqld-nt -install
In continuare, vei instala serverul APACHE. Este recomandat sa download-ezi versiunea de Apache pentru Windows cu extensia '.exe' de la Apache.org daca esti incepator si nu vrei sa compilezi codul sursa. In continuare, tot ce trebuie sa faci e sa dai click pe fisierul executabil si Apache se va instala pe disc. Poti rula Apache de la o fereastra-consola sau ca un serviciu Windows. Pentru a rula Apache de la consola alege optiunea 'Start Apache as console App' din grupul Apache din meniul Start. Se va deschide o fereastra de consola care va ramane activa pana vei opri serverul Apache alegand 'Shutdown Apache as Console App' sau apasand CTRL+C in ferestra de consola sau deschizand alta fereasta MS-DOS si tiparind:
C:\Program Files\Apache Group\Apache> apache -k shutdown
Apache va "asculta" protul 80 dupa ce va fi pornit. Pentru a te conecta la server, deschide browser-ul de Internet si scrie una din adresele: 8
http://localhost/ http://127.0.0.1/
Se va deschide o pagina HTML de bun-venit si informatii despre Apache. Daca nu se intampla nimic si apare o eroare deschide fisierul error.log din direcotrul logs al Apache si vei alfa ce a mers rau. Daca ai schimbat portul (altul decat 80) adauga :numar_port dupa adresa de URL La drum cu PHP... Copiaza distributia PHP de la PHP.net si dezarhiveaza pachetul in directorul 'C:\php4\'. Din acest director copiaza fisierele MSVCRT.DLL and PHP4TS.DLL in 'c:\windows\system'. Apoi, redenumeste php.inidist in php.ini and muta-l in directorul in care e instalat Windows-ul ('c:\windows\'). Deschide acest fisier cu Notepad si caua sirul de caractere "extensio_dir". Schimba valoarea implicita cu 'C:\php4'. Daca ai nevoie de extensii speciale (de exemplu, pentru grafice) sterge comentariile (caracterul ;) din fatza randului din php.ini de genul:
;extensions=php_**.dll
Acum ve trebui sa faci legatura intre PHP, Apache si MySQL. Du-te in directorul in care ai instalat Apache, cauta fisierul 'httpd.conf' din directorul '\conf' si adauga aceste linii:
ScriptAlias /php4/ "c:/php4/" AddType application/x-httpd-php4 .php AddType application/x-httpd-php4 .php3 AddType application/x-httpd-php4 .php4 AddType application/x-httpd-php4 .phtml Action application/x-httpd-php4 "/php4/php.exe"
Salveaza-l ca test.php in "\htdocs" din directorul Apache (locul in care va trebui sa pui toate scripturile PHP ca sa mearga). Apoi deschide-l in browser:
http://localhost/test.php
Se va obtine un fisier HTML cu informatii despre configirarea PHP. PHP poate fi folosit si fara server-ul Apache prin rularea din linia de comanda (Command Prompt) cu parametru un fisier *.php:
C:\php4\php text.php
Pentru a folosi PHP cu Apache, se vor copia toate fisierele *.php in directorul htdocs din folder-ul /Apache Group/Apache.
Instalare pe Linux
Linux Varianta 1 - Distributia RPM MySQL Este metoda recomandata de a instala MySQL pe Linux. Fisierele RPM care te intereseaza sunt: MySQL-VERSION.i386.rpm - Server-ul MySQL. MySQL-client-VERSION.i386.rpm - Programele-client MySQL. MySQL-VERSION.src.rpm - Codul sursa al tutoror RPM-urilor. Intra ca superuser (Tasteaza "su" la prompt si da parola de root). Intra in directorul cu RPM-urile copiate si tasteaza:
shell> rpm -ivh "mysql_file_name.rpm"
Vei fi intrebat parola. Tasteaz-o (e cea pe care ai pus-o in loc de 'parola_ta' in comanda de mai sus). Daca nu esti intrebat de parola intra in '/etc/rc.d/init.d/' si tasteaza ./mysql start si acum porneste serverul mysql ca mai sus. Odata ce clientul mysql a pornit vei primi promptul mysql>. Tasteaza:
shell> show databases;
Linux Varianta 2 - distributia sursa (Doar pentru avansati !!!) Copiaza fisierul .tar.gz de la http://www.mysql.com/downloads/. Dezarhiveaza-l cu:
gunzip mysql-3.23.22.tar.gz tar xf mysql-3.23.22.tar
Se va crea un director cu numele distributiei. Intra in acest director cu 'cd'. Comenzile pe care le vei folosi pentru a instala distributia sursa sunt:
shell> shell> shell> shell> shell> groupadd mysql useradd -g mysql mysql gunzip < mysql-VERSION.tar.gz | tar -xvf cd mysql-VERSION ./configure --prefix=/usr/local/mysql
10
make make install scripts/mysql_install_db chown -R root /usr/local/mysql chown -R mysql /usr/local/mysql/var chgrp -R mysql /usr/local/mysql cp support-files/my-medium.cnf /etc/my.cnf /usr/local/mysql/bin/safe_mysqld --user=mysql &
Apoi:
make make install
Configurare post-instalare Se vor instala tabelele de grant (cu drepturile de utilizatori) si se porneste server-ul cu comenzile: - pt. distributia sursa:
shell> ./scripts/mysql_install_db shell> cd mysql_installation_directory shell> ./bin/safe_mysqld --user=mysql &
PHP si Apache pe Linux Pe UNIX PHP e instalat ca o extensie a Apache. Deci instalarea lor se va face simultan. Incepe prin dezarhivarea pachetelor PHP si Apache.
gunzip apache 1.3.x.tar.gz tar xf apache1.3.x.tar gunzip php-4.02.tar.gz tar xf php-4.02
Foloseste 'cd' pentru a ajunge in directorul in care ai dezarhivat Apache si ruleaza 'configure' pentru a specifica calea in care se va instala Apache:
./configure --prefix=/path/to/apache
Apoi:
make make install
Apache e instalat acum in directorul specificat. Ultimii pasi: in directorul PHP copiaza fisierul php-ini.dist in /usr/local/lib/php.ini si deschide fisierul 'httpd.conf' din '/conf' al Apache si sterge comentariul (semnul ;) din fata liniei:
AddType application/x-httpd-php .php
11
Felicitari! Ai reusit sa instalezi MySQL, PHP si Apache. Daca, totusi, ceva a mers rau consulta sectiunile de F.A.Q. din documentatiile aferente.
12
Acest ultim prompt insemna ca MySQL mai asteapta sa fie introdus ceva (asteapta ';'). Alta caracteristica de notat este ca declaratiile SQL (Structured Query Language - un limbaj de interogare a bazelor de date) nu sunt case sensitive Daca vrei sa nu mai executi o comanda pe care ai scris-o partial, o poti anula cu '\c':
mysql> SELECT -> USER() -> \c mysql>
Ce insemna prompt-urile
mysql> Gata pentru o noua comanda. -> Asteapta urmatoarea linie dintr-o comanda. multi-linie. '> Astepta continuarea unui sir de caractere care incepe cu '. "> Astepta continuarea unui sir de caractere care incepe cu ".
13
Este important de stiut ce inseamna prompt-urile '> and "> , deoarece daca din greseala introduci un sir neterminat, orice altceva ce vei tasta (chiar si quit) nu va fi luat in seama. Pentru a te conecta la server, de obicei esti nevoit sa dai numele de utilizator si parola:
shell> mysql -h host -u user -p Enter password: ********
Comanda mysql invoca programul-monitor MySQL, un program client care te conecteaza la server. -h specifica numele gazdei (host) la care te vei conecta (doar daca te conectezi pe alta statie de lucru). -u specifica numele tau de utilizator ('root' daca ai MySQL pe propria statie, sau alt nume dat de administrator..). -p spune server-ului ca te vei conecta folosind o parola.
shell> mysql -h host -u user -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 459 to server version: 3.22.20a-log Type 'help' for help. mysql>
In functie de cum ai instalat si configurat MySQL, ai putea fi lasat sa te conectezi la server fara nume de utilizator sau parola:
shell> mysql
Dupa ce te-ai conectat cu succes la server te poti deconecta cu comanda QUIT sau apasand CTRL+D
mysql> QUIT
14
Crearea utilizatorilor
Sistemul de privilegii al MySQL
Una dinte cele mai bune caracteristici ale MySQL este ca suporta un sistem de privilegii (dreptul de a face o anumita actiune asupra unui obiect) pentru utilizatori foarte sofisticat. Cand vei crea un utilizator, ii vei da acces la un set de privilegii pentru a specifica ce anume poate sa faca si ce nu poate sa faca un utilizator. Un utilizator ar trebui sa aiba cel mai mic nivel de privilegii necesar pentru a-si indeplini sarcina. Crearea drepturilor pentru utilizatori se face cu comanda GRANT, iar retragerea drepturilor cu REVOKE Pentru a crea un administrator:
mysql> grant all -> on * -> to fred identified by mnb123 -> with grant option;
Crearea tabelelor
Vom crea o baza de date angajati pe care o vom folosi si in alte ocazii: Pe Windws:
create database angajati;
Ultima conanda acorda toate drepturile asupra tabelei angajati utilizatorului Marius. Iesi cu QUIT si intra din nou cu nume de utilizator de aceasta data:
15
mysql -u user_name -p
Cu comanda USE: mysql>USE angajati; Specificand direct numele bazei de date la prompt:
mysql>\u angajati;
Daca nu specificam o baza de date cand lucram cu MySQL, se va genera o eroare! Pentru baza noastra de date vom avea o tabela cu detalii despre angajati si o tabela cu date personale. Dupa ce ai selectat baza de date angajati dai urmatoarea comanda:
mysql> CREATE TABLE angajati_data -> ( -> emp_id int unsigned not null auto_increment primary key, -> f_name varchar(20), -> l_name varchar(20), -> title varchar(30), -> age int, -> yos int, -> salary int, -> perks int, -> email varchar(60) -> ); Query OK, 0 rows affected (0.01 sec) CREATE TABLE e urmata de numele tabelei si poia de numele si tipul de date al campurilor din baza de
date. 'varchar' inseamna caractere de lungime variabile. Numarul din paranteza este lungimea maxima de caractere admise.'not null' specifica ca nu avem voie sa avem valori nule pe acel camp in inregistrari. 'int' inseamna numar inreg, iar 'unsigned' numar pozitiv. 'auto_increment' specifica pentru MySQL sa atribuie o valoare automat la o noua adaugare de inregistrare cu o valoare mai mare cu 1 decat cea mai mare valoare din acel camp (necesar pentru un camp ID). 'primary key' speciofica ca acel camp va fi indexat (fiecare valoare va fi unicat).
Tipuri de campuri
Cele trei tipuri de baza pentru campuri sunt: numeric, data si timp si sir de caractere(string). Cand alegi un anumit tip sau subtip, poti specifica si lungimea maxima admisa (M, maxim 255). Tipurile de date numerice Pentru numerele in virgula flotanta (float), poti specifica cu D numarul de cifre dupa puctul zecimal. 16
Pentru numerele intregi poti sa specifici daca vor fi doar pozitive cu 'unsigned'. Tipuri de date intregi
Tip Interval TINYINT[(M)] -127..128 or 0..255 SMALLINT[(M)] -32768..32767 or 0..65535 MEDIUMINT[(M)] -8388608.. 8388607 or 0..16777215 INT[(M)] -231..231-1 or 0..232-1 INTEGER[(M)] BIGINT[(M)] -263..263-1 8 or 0..264-1 (Bytes) 1 2 3 Descriere Foarte mic integers Intregi mici Marime medie
4 8
M+2
NUMERIC[(M,D)]
la fel
Sinonim cu DECIMAL.
Un timestamp, folosit in tranzactii. Un an in format cu 2 sau 4 cifre You can specify 2 or 4 digit
TIMESTAMP-uri
Type Specified TIMESTAMP TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(10) Display YYYYMMDDHHMMSS YYYYMMDDHHMMSS YYMMDDHHMMSS YYMMDDHHMM
17
Tipuri pentru siruri de caractere Se impart in trei grupuri:siruri normale: CHAR (fixed length character) si VARCHAR (variable length character), siruri TEXT si BLOB pentru siruri lungi/date binare si sirurile SET si ENUM (valori predefinte). Tipuri pentru siruri de caractere regulare
Tip [NATIONAL] CHAR(M) [BINARY] [NATIONAL] VARCHAR(M) [BINARY] Interval 1 to 255 1 to 255
Exemplu:
create table _tabela1 ( id int auto_increment primary key, answer enum (da, nu) default nu );
Tipul de camp NULL Pentru a face o valoare dintr-un camp NULL, nu include acel camp in declaratia INSERT. Campurile au ca valoare implicita NULL daca nu specifici 'NOT NULL'. Pentru compararea valorilor cu NULL se folosesc 'IS NULL' sau 'IS NOT NULL'. Descrierea tablelelor Permite afisarea detaliilor despre campurile tabelei.
mysql> DESCRIBE angajati_data;
18
+--------+------------------+------+-----+---------+------+ | Field | Type | Null | Key | Default | Extra| +--------+------------------+------+-----+---------+------| | emp_id | int(10) unsigned | | PRI | 0 | | | | auto_increment| | | | | | f_name | varchar(20) | YES | | NULL | | | l_name | varchar(20) | YES | | NULL | | | title | varchar(30) | YES | | NULL | | | age | int(11) | YES | | NULL | | | yos | int(11) | YES | | NULL | | | salary | int(11) | YES | | NULL | | | perks | int(11) | YES | | NULL | | | email | varchar(60) | YES | | NULL | | +--------+------------------+------+-----+---------+------+ 9 rows in set (0.00 sec)
Exemplu:
mysql> INSERT INTO angajati_data -> (f_name, l_name, title, age, yos, salary, perks, email) -> values -> ("Manish", "Sharma", "CEO", 28, 4, 200000, -> 50000, "[email protected]"); Query OK, 1 row affected (0.00 sec)
Daca vrei sa inserezi unul dintre urmatoarele caractere intr-un camp de tip text, trebui sa-i adaugi inainte un caracter backslash(\):
\ % _ (apostrof) :\' (ghilimele):\" (backslash) :\\ (procent) :\% (liniuta de subliniere) :\_
19
perks = perks + 5000 WHERE title='CEO'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
De exemplu, pentru a extrage nume si prenumele tuturor angajatilor (presupunand ca ai mai adaugat pe parcurs mai multe inregistrari cu INSERT sau LOAD DATA INFILE):
mysql> SELECT f_name, l_name from angajati_data; +---------+------------+ | f_name | l_name | +---------+------------+ | Manish | Sharma | | John | Hagan | | Ganesh | Pillai | | Anamika | Pandit | | Mary | Anchor | | Fred | Kruger | | John | MacFarland | | Edward | Sakamuro | | Alok | Nanda | | Hassan | Rajabi | | Paul | Simon | | Arthur | Hoopla | | Kim | Hunter | | Roger | Lewis | | Danny | Gibson | | Mike | Harper | | Monica | Sehgal | | Hal | Simlai | | Joseph | Irvine | | Shahida | Ali | | Peter | Champion | +---------+------------+ 21 rows in set (0.00 sec)
Pentru a afisa intreaga tabela, in loc sa specificam toate campurile vom folosi simbolul '*':
SELECT * from angajati_data;
Selectia conditionala Puterea SGBD-ului sta in permiterea de a extrage informatii dupa anumite conditii specificate
SELECT f_name, l_name from angajati_data where f_name = 'John'; +--------+------------+ | f_name | l_name | +--------+------------+ | John | Hagan | | John | MacFarland | +--------+------------+ 2 rows in set (0.00 sec)
20
Comparatiile MySQL sunt case insensitive ceea ca inseamna ca "john", "John" sau "JoHn" ar merge in exemplul de mai sus. Operatori de comparatie
Operator Nume = eqalitate > mai mare Exemplu customerid = 3 amount>60.00
< mai mic amount<60.00 >= mai mic sau egal amount>=60.00 <= mai mic sau egal amount<=60.00 != sau diferit quantity != 0 <> IS NOT valoare nenula NULL IS NULL valoare nula BETWEEN interval de valori amount between 0 and 60.00 IN inclus intr-un set predefinit city in (Carlton, Moe) NOT IN neinclus intr-un set predefinit city not in (Carlton,Moe) LIKE NOT LIKE REGEXP cautare pattern cautare pattern expresie regular name like name regexp (Fred %)
Conditiile SQL pot contine si operatorii logici: AND, OR si NOT. Sa afisam numele angajatilor care au numele incepand cu 'S' sau 'A':
SELECT l_name from angajati_data where l_name like 'S%' OR l_name like 'A%'; +----------+ | l_name | +----------+ | Sharma | | Anchor | | Sakamuro | | Simon | | Sehgal | | Simlai | | Ali | +----------+ 7 rows in set (0.00 sec)
21
Alte exemple:
SELECT f_name, l_name, title from -> angajati_data where title -> IN ('Web Designer', 'System Administrator'); +---------+--------+----------------------+ | f_name | l_name | title | +---------+--------+----------------------+ | Anamika | Pandit | Web Designer | | Mary | Anchor | Web Designer | | Roger | Lewis | System Administrator | | Danny | Gibson | System Administrator | +---------+--------+----------------------+ 4 rows in set (0.00 sec) select f_name, l_name, age from -> angajati_data where age BETWEEN -> 32 AND 40; +---------+------------+------+ | f_name | l_name | age | +---------+------------+------+ | John | Hagan | 32 | | Ganesh | Pillai | 32 | | John | MacFarland | 34 | | Alok | Nanda | 32 | | Hassan | Rajabi | 33 | | Arthur | Hoopla | 32 | | Kim | Hunter | 32 | | Roger | Lewis | 35 | | Danny | Gibson | 34 | | Mike | Harper | 36 | | Shahida | Ali | 32 | | Peter | Champion | 36 | +---------+------------+------+ 12 rows in set (0.00 sec) select -> -> -> f_name, l_name, salary from angajati_data where salary NOT BETWEEN 90000 AND 150000;
+---------+------------+--------+ | f_name | l_name | salary | +---------+------------+--------+ | Manish | Sharma | 200000 | | Mary | Anchor | 85000 | | Fred | Kruger | 75000 | | John | MacFarland | 80000 | | Edward | Sakamuro | 75000 | | Alok | Nanda | 70000 | | Paul | Simon | 85000 | | Arthur | Hoopla | 75000 | | Hal | Simlai | 70000 | | Joseph | Irvine | 72000 | | Shahida | Ali | 70000 | +---------+------------+--------+ 11 rows in set (0.00 sec)
22
Sortarea datelor Inregistrarile extraswe anterior au fost afisate in rodinea in care erau stocate in tabela. Pentru a le sorta folosim clauza ORDER BY a comenzii SELECT.
SELECT l_name, f_name from angajati_data ORDER BY l_name; +------------+---------+ | l_name | f_name | +------------+---------+ | Ali | Shahida | | Anchor | Mary | | Champion | Peter | | Gibson | Danny | | Hagan | John | | Harper | Mike | | Hoopla | Arthur | | Hunter | Kim | | Irvine | Joseph | | Kruger | Fred | | Lewis | Roger | | MacFarland | John | | Nanda | Alok | | Pandit | Anamika | | Pillai | Ganesh | | Rajabi | Hassan | | Sakamuro | Edward | | Sehgal | Monica | | Sharma | Manish | | Simlai | Hal | | Simon | Paul | +------------+---------+ 21 rows in set (0.00 sec)
23
+--------+----------+------+ | f_name | l_name | age | +--------+----------+------+ | Edward | Sakamuro | 25 | | Mary | Anchor | 26 | +--------+----------+------+ 2 rows in set (0.01 sec)
Comanda de mai sus extrage 3 angajati incepand de la inregistrarea 6. Folosirea clauzei DISTINCT permite listarea doar a valorilor distincte din baza de date pentru fiecare camp in parte. Functii agregat
MIN(): Valoare minima MAX(): Valoare maxima SUM(): Suma valorilor AVG(): Media aritmetica COUNT(): Numarul inregistrarilor extrase select MIN(salary) from angajati_data; +-------------+ | MIN(salary) | +-------------+ | 70000 | +-------------+ 1 row in set (0.00 sec) select MAX(salary) from angajati_data; +-------------+ | MAX(salary) | +-------------+ | 200000 | +-------------+ 1 row in set (0.00 sec) select SUM(salary) from angajati_data; +-------------+ | SUM(salary) | +-------------+
24
| 1997000 | +-------------+ 1 row in set (0.00 sec) select COUNT(*) from angajati_data; +----------+ | COUNT(*) | +----------+ | 21 | +----------+ 1 row in set (0.00 sec)
Denumirea campurilor in SELECT MySQL permite sa denumesti campurile extrase cu termeni mai descriptivi pentru datele extrase.
select avg(salary) AS 'Salariu mediu' from angajati_data; +----------------+ | Salariu mediu | +----------------+ | 95095.2381 | +----------------+ 1 row in set (0.00 sec)
Clauza GROUP BY permite gruparea informatiilor similare. Deci, pentru a lista toate functiile unice din tabela:
select title from angajati_data GROUP BY title; +----------------------------+ | title | +----------------------------+ | CEO | | Customer Service Manager | | Finance Manager | | Marketing Executive | | Multimedia Programmer | | Programmer | | Senior Marketing Executive | | Senior Programmer | | Senior Web Designer | | System Administrator | | Web Designer | +----------------------------+ 11 rows in set (0.01 sec)
25
+----------------------------+-------------+ | title | AVG(salary) | +----------------------------+-------------+ | CEO | 200000.0000 | | Finance Manager | 120000.0000 | | Senior Marketing Executive | 120000.0000 | | Senior Programmer | 115000.0000 | | Senior Web Designer | 110000.0000 | +----------------------------+-------------+ 5 rows in set (0.00 sec)
Tipuri de join-uri in MySQL Produs cartezian, Full Join, Cross join Toate combinatiile tuturor liniilor din tabela. Se specifica prin virgula si fara clauza WHERE. Inner join Poate fi specificat prin virgula intre numele tabelelor sau prin folosirea WHERE sau cu cuvintele cheie INNER JOIN. Equi-join Foloseste o conditie cu '=' pentru a face corespondente intre inregistrari.
26
Left join Incearca sa gasesca corespondente intre tabele si cand nu gaseste, umple inregistrarile fara pereche cu NULL.
Stergerea tabelelor
DROP TABLE angajati_data;
Crearea indecsilor
Se poate face cu comanda INDEX sau specificand la crearea unui tabel un camp ca PRIMARY KEY.
index nume_index (nume_coloana_indexata) create table my_table ( id_col int unsigned auto_increment primary key, another_col text );
De exemplu:
create table my_table( char_column char (255) not null, text_column text not null, index index_on_char (char_column(20)), index index_on_text (text_column(200)) );
27
ADD UNIQUE [index] (column,...) ALTER [COLUMN] column {SET DEFAULT value | DROP DEFAULT} CHANGE [COLUMN] column new_column _description MODIFY [COLUMN] column_description DROP [COLUMN] column DROP PRIMARY KEY DROP INDEX index RENAME[AS] new_table_name
Adauga un index pt. unicate Adauga/sterge valorile implicite Modificari pentru coloane
MySQL ofera 3 tipuri de tabele: ISAM, MyISAM (implicit), BDB, and Heap alese dupa sintaxa:
create table nume type=tip_tabela( nume_col coloana attribut );
Heap-urile sunt tabele hash temporare rezidente in memorie. Tabelele BDB sunt folosite la tranzactii, iar tabelele ISAM nu mai sunt recomandate. Deci alegerea implicita MyISAM este cea mai buna si nu trebuie sa-ti faci grji ca trebui sa specifici vreodata un tip de tabela. Sintaxe ALTER: (Redenumire tabela:)alter table nume_vechi rename nume_nou (Modificare camp:)alter table my_table add column my_column text not null (Stergere camp):alter table nume_tabela drop column nume_camp Indecsi:
alter alter alter alter alter table my_table add index index_name (column_name1, column_name2, ...) table my_table add unique index_name(column_name) table my_table add primary key(my_column) table table_name drop index index_name table_name test10 drop primary key
28
MySQL are o interfata SQL foarte complexa, dar si intuitiva si usor de invatat. Capitolul acesta se ocupa cu prezentarea detaliata a unor comenzi diverse (cum se folosesc ele ai aflat in Utilizare MySQL), tipuri de date si functii de care vei avea nevoie ca sa folosesti MySQL eficient.
29
Undersore `_'
Numere Numerele intregi sunt reprezentate ca o secventa de cifre, iar float-urile folosesc '.' ca separator decimal. Valoarea NULL Valoarea NULL inseamna 'Nici o informatie' si difera de valoarea 0 pentru intregi si de sirul gol pentru siruri de caractere. Numele folosite pentru baze de date, tabele, indecsi, coloane si alias-uri Un nume poate contine caractere alfanumerice din setul curent de cacactere (implicit ISO-8859-1 Latin1). Un nume poate incepe cu orice caracter valid in nume. Un nume poate incepe si cu un numar, dar nu poate fi compus numai din numere. Nu poti folosi '.' in nume deoarece e folosit pentru a referi coloanele din tabele. sensibilitatea la majuscule sau minuscule pentru numele alese depinde de sistemul de operare (case sensitive in Unix si case insensitive in Windows). Oricum, in Windows nu poti referi aceeasi baza de date in aceeasi interogare cu un nume in cazuri diferite. Urmatoare interogare nu merge:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
Numele de coloane sunt case insensitive. Alias-urile sunt case sensitive. Variabile definite de utilizator Se pot defini cu @nume_variabila. Ele nu trebuiesc initializate, contin de la inceput valoare NULL si pot stoca un integ, un numar real, un float sau un sir de caractere. Poti seta o variabila la o anumita valoare cu:
SET @variable= { integer expression | real expression | string expression }[,@variable= ...].
sau cu:
select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Comentarii MySQL suporta cometariile #pana la sfarsit de linie, --pana la sfarsit de linie si /*linii multiple*/.
mysql> select mysql> select mysql> select mysql> select /* comentariu multi-linii 1+1; # Comentariu pana la sfarsitul linie 1+1; -- Comentariu pana la sfarsitul liniei 1 /* comentariu in-line */ + 1; 1+
30
*/ 1;
Cuvinte rezervate
action alter asc between blob cascade change columns cross data datetime day_second dec delay_key_write distinct end enclosed fields float4 from global having hour_minute ignore inner integer int3 if key leading lines lock longtext match middleint modify natural null optionally add after avg bigint bool case check comment current_date database day dayofmonth decimal delete distinctrow else enum file float8 for grant heap hour_second in insert interval int4 is keys left limit logs low_priority mediumblob min_rows month numeric on or aggregate and bit both char checksum constraint current_time databases day_hour dayofweek default desc double escape explain first flush full grants high_priority hosts index insert_id int1 int8 isam kill length load long max mediumtext minute monthname no optimize order all as binary by character column create current_timestamp date day_minute dayofyear delayed describe drop escaped exists float foreign function group hour identified infile int int2 into join last_insert_id like local longblob max_rows mediumint minute_second myisam not option outer
avg_row_length auto_increment
31
outfile precision processlist references replace rlike select smallint sql_small_result starting tables then tinytext type unlock values varbinary where
sql_big_tables sql_big_selects sql_log_update sql_select_limit straight_join table text tinyblob to unique usage varying when zerofill string terminated timestamp trailing using update variables write year_month
sql_low_priority_updates sql_log_off status temporary time tinyint use unsigned varchar with year
sql_big_result sql_warnings
Functii
Functii pentru compararea de siruri LIKE Cauta un 'pattern' intr-o expresie folosind caracterele wildcard:%(orice numar de caractere) si _ (un singur caracter).
expr LIKE pat [ESCAPE escape-char] mysql> select jay greenspan like jay%; jay greenspan like jay% 1
REGEXP Face o cautare folosind o expresie string si o expresie regulara. Returneaza 1 (a gasit) sau 0(n-a gasit).
expr REGEXP pat mysql> select name from guestbook where name regexp ^j.*g;
STRCMP STRCMP(expr1,expr2) Returneaza 0 daca sirurile sunt egale, -1 daca primul sir e mai mic si 1 daca sirul 2 e mai mic ca sirul 1. Functii pentru controlul programului IFNULL IFNULL(expr1,expr2)
32
IF
IF(expr1,expr2,expr3) mysql> select if(name like jay%, Yes, No) as Jay Names -> from guestbook;
Functii matematice ABS (modulul unui numar) SIGN (semnul:-1 negativ, 1 pozitiv, 0 egal cu 0) MOD (rstul impartirii) FLOOR (cea mai mare valoare intreaga mai mica ca un numar) CEILING (cea mai mica valoare intreaga mai mare ca un numar) ROUND (un numar rotunjit la o valoare intreaga) TRUNCATE (trunceaza un numar la un anumit numar de zecimale)
mysql> select truncate(8.53,0), truncate(8.43,0), truncate(8.534,2);
EXP (exponentiala unui numar) LOG (logaritm) LOG10 (logaritm zecimal) POW(X,Y) (X la puterea Y) SQRT (radacina patrata) PI (aproximarea lui PI) COS (cosinus) SIN (sinus) TAN (tangenta) ACOS (arccosinus) ASIN (arcsinus) ATAN (arctangenta) COT (cotangenta) RAND (valoare la intamplare intre 0 si 1.0) LEAST (cel mai mic argument)
mysql> select least(2,7,9,1); |least(2,7,9,1)| | 1 | 1 row in set (0.00
sec)
33
DEGREES (converteste din radiani in grade) RADIANS (converteste din grade in radiani) Functii pentru siruri de caractere ASCII(str) (codul ASCII)
mysql> select ascii(\n); | ascii(\n)| | 10 | 1 row in set (0.00 sec)
ORD(str) CONV(N,from_base,to_base) BIN(N) (converteste N in baza 2) OCT(N) (converteste N in baza 8) HEX(N) (converteste N in baza 16) CHAR(N1,N2,...) (sirul de caractere format din reprezentarile ASCII ale argumentelor intregi) CONCAT(str1,str2,...) (concateneaza doua siruri de cacactere) LENGTH (lungimea unui sir) LOCATE(substr,str [,pos]) (cauta pozitia unui subsir intr-un sir)
mysql> select locate(s, mysql functions) as example1, -> locate(s, mysql functions,4) as example2; |example1|example2| | 3 | 15 | 1 row in set (0.00 sec)
INSTR(str,substr) (pozitia subsirului in sir) LPAD(str,len,padstr) (sirul padstr e adaugat la stanga lui srt) RPAD LEFT(str,len) (primele 'len' caractere din str) RIGHT(str,len) SUBSTRING(str,pos[,len]) sau MID(str,pos,len)
mysql> select mid(mysqlfunctions,6,8); | mid(mysqlfunctions,6,8)| | function | 1 row in set (0.00 sec)
SUBSTRING_INDEX(str,delim,count)
mysql> select substring_index(mysqlfunctionsmysql, fu, | substring_index(mysqlfunctions, fu, 1) | | mysql | 1 row in set (0.00 sec) mysql> select substring_index(mysqlfunctionsmysql, fu, | substring_index(mysqlfunctionsmysql, fu, -1) | nctionsmysql 1 row in set (0.00 sec) | | -1); 1);
LTRIM RTRIM 34
TRIM TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) REPLACE(str,from_str,to_str) SOUNDEX(str) (sirul in format SOUNDEX) SPACE(N) (un spatiu de N pozitii) REPEAT(str,count) (repeta str de 'count' ori) REVERSE (inverseaza un sir) INSERT(str,pos,len,newstr)
mysql> select insert(mysqlfunctions, 6,2,FU); + + |insert(mysqlfunctions, 6,2,FU)| + + |mysqlFUnctions | + + 1 row in set (0.44 sec)
FIELD(str,str1,str2,str3,...) (pozitia str in cadrul argumentelor) LCASE (lowercase) UCASE (uppercase) LOAD_FILE (continutul unui fiser ca sir Functii pentru data calendaristica si timp DAYOFWEEK
mysql> select dayofweek(2001-01-01); + + | dayofweek(2001-01-01)| | 2 | 1 row in set (0.33 sec)
WEEKDAY DAYOFMONTH DAYOFYEAR MONTHNAME QUARTER (semestrul din care face parte data) WEEK(date [, first]) (first=0-saptamana incepe duminica, first=1-saptamana incepe luni) YEAR YEARWEEK (anul si saptamana in format YYYYWW) HOUR MINUTE SECOND PERIOD_ADD(P,N) (adauga N luni la perioda P) PERIOD_DIFF(P1,P2) DATE_ADD DATE_SUB(date,INTERVAL expr type) TO_DAYS FROM_DAYS DATE_FORMAT
Specificatori pentru DATE_FORMAT %M Luna (JanuaryDecember) %W Ziua (Sunday Saturday) %D Numarul zilei(1st, 2nd, 3rd, etc.)
35
%Y %y %a %d %e %m %c %b %j %H %k %h %I %l %i %r %T %S %s %p %w %U %u %V %v %X %x %%
Anul AAAA Anul AA Numele abreviat al zilei(Sun..Sat) Numarul zilei lunii(00..31) Numarul zilei lunii(0..31) Numarul lunii(01..12) Numarul lunii(1..12) Numele lunii(Jan..Dec) Numarul zilei in an(001..366) Ora (00..23) Ora (0..23) Ora (01..12) Ora (01..12) Ora (1..12) Minutele(00..59) Timpul, 12-ore (hh:mm:ss [AP]M) Timpul, 24-ore (hh:mm:ss) Secundele(00..59) Secundele (00..59) AM sau PM Ziua saptamanii (0=Sunday..6=Saturday) Saptamana (0..53) Saptamana (0..53) Saptamana (1..53) Saptamana (1..53) Anul pentru saptamana Anul pentru saptamana Caracterul % %W %M %d, %Y);
Exemplu:
mysql> select date_format(2001-01-01, | date_format(2001-01-01, %W %M | Monday January 01, 2001 1 row in set (0.00 sec) %d, %Y) | |
TIME_FORMAT CURDATE CURTIME NOW (data si ora curenta YYYY-MM-DD HH:MM:SS) Alte functii diverse Database (numele bazei de date curente) User (numele utilizatorului curent) VERSION (versiunea MySQL) LAST_INSERT_ID (ultima valoare inserata intr-un camp 'auto_increment')
36
select_expression,... [INTO {OUTFILE | DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] [FOR UPDATE | LOCK IN SHARE MODE]]
INSERT
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... sau INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... sau INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=expression, col_name=expression, ...
ALTER TABLE
ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER column_name ] sau ADD [COLUMN] (create_definition, create_definition,...) sau ADD INDEX [index_name] (index_col_name,...) sau ADD PRIMARY KEY (index_col_name,...) sau ADD UNIQUE [index_name] (index_col_name,...) sau ADD FULLTEXT [index_name] (index_col_name,...) sau ADD [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) [reference_definition] sau ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} sau CHANGE [COLUMN] old_col_name create_definition sau MODIFY [COLUMN] create_definition sau DROP [COLUMN] col_name sau DROP PRIMARY KEY sau DROP INDEX index_name sau DISABLE KEYS sau ENABLE KEYS sau RENAME [TO] new_tbl_name sau ORDER BY col sau table_options
UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1, [col_name2=expr2, ...] [WHERE where_definition] [LIMIT #]
37
DELETE
DELETE [LOW_PRIORITY | QUICK] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT rows] sau DELETE [LOW_PRIORITY | QUICK] table_name[.*] [table_name[.*] ...] FROM table-references [WHERE where_definition]
CREATE INDEX
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )
CREATE TABLE
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] sau PRIMARY KEY (index_col_name,...) sau KEY [index_name] (index_col_name,...) sau INDEX [index_name] (index_col_name,...) sau UNIQUE [INDEX] [index_name] (index_col_name,...) sau FULLTEXT [INDEX] [index_name] (index_col_name,...) sau [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) [reference_definition] sau CHECK (expr) type: sau sau sau sau sau sau sau sau sau sau TINYINT[(length)] [UNSIGNED] [ZEROFILL] SMALLINT[(length)] [UNSIGNED] [ZEROFILL] MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] INT[(length)] [UNSIGNED] [ZEROFILL] INTEGER[(length)] [UNSIGNED] [ZEROFILL] BIGINT[(length)] [UNSIGNED] [ZEROFILL] REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
38
sau sau sau sau sau sau sau sau sau sau sau sau sau sau sau sau
CHAR(length) [BINARY] VARCHAR(length) [BINARY] DATE TIME TIMESTAMP DATETIME TINYBLOB BLOB MEDIUMBLOB LONGBLOB TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM(value1,value2,value3,...) SET(value1,value2,value3,...)
index_col_name: col_name [(length)] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MYISAM } sau AUTO_INCREMENT = # sau AVG_ROW_LENGTH = # sau CHECKSUM = {0 | 1} sau COMMENT = "string" sau MAX_ROWS = # sau MIN_ROWS = # sau PACK_KEYS = {0 | 1} sau PASSWORD = "string" sau DELAY_KEY_WRITE = {0 | 1} sau ROW_FORMAT= { default | dynamic | fixed | compressed } sau RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# sau UNION = (table_name,[table_name...]) sau DATA DIRECTORY="directsauy" sau INDEX DIRECTORY="directsauy" select_statement: [IGNORE | REPLACE] SELECT ...
CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] db_name
DROP DATABASE
DROP DATABASE [IF EXISTS] db_name
DROP INDEX
39
DROP TABLE
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]
RENAME TABLE
RENAME TABLE tbl_name TO new_table_name[, tbl_name2 TO new_table_name2,...]
JOIN
table_reference, table_reference table_reference [CROSS] JOIN table_reference table_reference INNER JOIN table_reference table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr table_reference LEFT [OUTER] JOIN table_reference USING (column_list) table_reference NATURAL LEFT [OUTER] JOIN table_reference { oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
40
Administrarea MySQL
Administrarea utilizatorilor Controlul accesului Comezile GRANT si REVOKE Backup-ul bazelor de date Securitatea datelor Optimizarea MySQL
Administrarea oricarui sistem de gestiune a bazelor de date relationale (SGBDR) necesita putina munca. Fiecare sistem are propriile metode pentru administrare si propriile dificultati cand vine vorba de adaugarea si stergerea de conturi ale utilizatorilor, backup si asigurarea securitatii. Administarea serverului MySQL nu este dificila per ansamblu, dar poate speria la inceput.
Administrarea utilizatorilor
Tabelele de grant Drepturile utilizatorilor MySQL sunt stocate in cateva tabele care sunt create automat la instalarea MySQL. Aceste tabele apartin bazei de date mysql:
mysql> use mysql Database changed mysql> show tables; +-------------------+ | Tables in mysql | +-------------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-------------------+ 6 rows in set (0.00 sec)
Fiecare dintre aceste tabele corespunde controlului unui nivel de acces. Poti crea un oricati utilizatori care pot accesa MySQL de pe diferite gazde. Pentru fiecare combinatie utilizator/gazda, acorzi acces la o intreaga baza de data, la anumite tabele, sau la anumite coloane dintr-o tabele. Aditional, aceste tabele acorda privilegii de administrare. Utilizatorilor le poate fi dat dreptul de a adauga/sterge baze de date sau de a acorda altor utilizatori drepturi de administare. In practica, nu ar trebui sa acorzi mai multe drepturi decat e necesar pentru a proteja datele de curiosi sau de incompetenti. Pentru asta trebuie sa stii ca drepturile sunt acordate intr-un mod ierarhic. Cele acordate pe tabela user sunt universale: daca un utilizator are privilegiu de stergere(drop) in tabela user,
41
acesta poate sterge orice tabela din rocie baza de date din MySQL. Tabela db acorda privilegii asupra unei intregi baze de date. Pentru o tabela/set de tabele foloseste tables_priv. Tabela columns_priv acorda drepturi asupra unor anumite colobne dintr-o tabela. Tabela user Orice utilizator care vrea sa lucreze in MySQL trebuie sa fie inscris in acesta tabela. Drepturile pot fi acordate in alta parte, dar fara o inscriere aici, utilizatorului nu i se va permite conectarea la server.
mysql> show columns from user; +-------------------+---------------+-------+-------+-----------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------------------------------------------------------+ | Host | char(60) | | PRI | | | | User | char(16) | | PRI | | | | Password | char(16) | | | | | | Select_priv | enum(N,Y) | | | N | | | Insert_priv | enum(N,Y) | | | N | | | Update_priv | enum(N,Y) | | | N | | | Delete_priv | enum(N,Y) | | | N | | | Create_priv | enum(N,Y) | | | N | | | Drop_priv | enum(N,Y) | | | N | | | Reload_priv | enum(N,Y) | | | N | | | Shutdown_priv | enum(N,Y) | | | N | | | Process_priv | enum(N,Y) | | | N | | | File_priv | enum(N,Y) | | | N | | | Grant_priv | enum(N,Y) | | | N | | | References_priv | enum(N,Y) | | | N | | | Index_priv | enum(N,Y) | | | N | | | Alter_priv | enum(N,Y) | | | N | | +-------------------+---------------+-------+-------+-----------+-------+ 17 rows in set (0.00 sec)
MySQL identifica un utilizator dupa combinatia user-host. Prin urmare, un utilizator poate avea cate un set de drepturi diferite pentru fiecare gazda (host) pe care o foloseste pentru a se conecta la MySQL. Drepturile setate pe Y (yes) sunt acodate pentru toate tabele din orice baza de date. Alte drepturi: - File_priv acorda dreptul de a scrie si citi fisiere de pe disc. - process_priv acorda dreptul de a vedea si de a termina toate comenzile si threrad-rile in curs de executie(poti vedea ce fac si ce tasteaza ceilalti utilizatori !!). - Grant_priv da dreptul de a putea acorda mai departe privilegiile proprii altor utilizatori. - Reload_priv e folosit, in special pentru a face comenzi flush - Shutdown_priv da dreptul de a opri server-ul folosind mysqladmin shutdown. Tabela db
mysql> show columns from db; +---------------------------------------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +---------------------------------------------------------------------------+ | Host | char(60) | | PRI | | | | Db | char(32) | | PRI | | | | User | char(16) | | PRI | | | | Select_priv | enum(N,Y) | | | N | | | Insert_priv | enum(N,Y) | | | N | | | Update_priv | enum(N,Y) | | | N | | | Delete_priv | enum(N,Y) | | | N | |
42
| Create_priv | enum(N,Y) | | | N | | | Drop_priv | enum(N,Y) | | | N | | | Grant_priv | enum(N,Y) | | | N | | | References_priv | enum(N,Y) | | | N | | | Index_priv | enum(N,Y) | | | N | | | Alter_priv | enum(N,Y) | | | N | | +---------------------------------------------------------------------------+ 13 rows in set (0.01 sec)
Drepturile specificate aici merg doar pentru baza de date specificate in coloana db_column. Tabelele tables_priv si columns_priv Ofera drepturi asupra unei tabele sau asupra unor coloane dintr-o tabela.
mysql> show columns from tables_priv; +-------------------------------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------------------------------------------------------------+ | Host | char(60) | | PRI | | | | Db | char(60) | | PRI | | | | User | char(16) | | PRI | | | | Table_name | char(60) | | PRI | | | | Grantor | char(77) | | MUL | | | | Timestamp | timestamp(14) | YES | | NULL | | | Table_priv |set(Select,Insert,Update, | | | | Delete,Create,Drop,Grant, | | | | References,Index,Alter) | | | | | | | | | | Column_priv | set(Select,Insert, | | | | | Update,References) | | | +-------------------------------------------------------------------+ 8 rows in set (0.00 sec)
Controlul accesului
MySQL foloseste tabelele de privilegii pentru a determina ce are si ce nu are un utilizator dreptul sa faca in doi pasi: 1. Verificarea conexiunii: MySQL verifica daca ai voie sa te conectezi la server bazandu-se pe numele de utilizator (blank insemna orice utilizator), numele de gazda si pe parola. Pentru numele gazdei poti folosi caracterul wildcard '%' ca semnificand orice gazda. 2. Verificarea cererii: MySQL verifica in toate tabele de drepturi daca ai drepturile necesare pentru a obtine informatiile dorite.
43
N)
Nu este insa ce si-ar dori sa fac administratorul de fiecare data. Din fericire, MySQL ofera cateva comenzi care fac lucrul cu utilizatorii mult mai usor:
GRANT
GRANT privilegii [coloane] ON obiect TO utilizator [IDENTIFIED BY parola] [WITH GRANT OPTION]
Niveluri de drepturi grant all on *.* Acorda drepturi universale grant all on database.* Acorda drepturi asupra tuturor tabelelor din baza de date grant all on database.table_name Drepturi pentru o singura tabela grant all(col1, col2) on database.table_name Drepturi pentru anumite coloane dintr-o tabela
mysql> grant all on guestbook.* to ion@localhost identified by parola1; Prima parte a comenzii poate fi all sau alta optiune din tabela user. Partea a doua a comenzii (on guestbook) arata unde se vor aplica drepturile (vezi tabelul de mai sus). Partea a treia arata cui i se acorda
drepturile (utilizator@gazda), iar ultima parte arata parola cu care este identificat utilizatorul.
grant select, update, insert on guestbook2k.guestbook to adi@localhost identified by parola2;
Acesta comanda permite lui adi sa vada, sa modifice, sa actualizeze si sa insereze inregistrari in tabela 'guestbook' din baza de date 'guestbook2k'.
grant select, update (nume, email) on guestbook2k.guestbook to monica@localhost identified by Mel12068;
Marius are drepturi depline (poate chiar acorda privilegii altor utilizatori).
REVOKE
Daca vrei sa anulezi drepturile acordate unui utilizator poti folosi comanda REVOKE:
REVOKE privilegii [(coloane)] ON item FROM utilizator
Comanda revoke Shutdown on *.* from cosmin@localhost; revoca dreptul de shutdown al lui Cosmin. Daca vrei sa stergi un utilizator de tot trebuie sa-l stergi din tabela 'user':
delete from user where user=user and host=host
Afisarea drepturilor Din versiunea 3.23.4 MySQL a introdus comanda show grants care permite vizualizarea drepturilor acordate la un moment dat:
mysql> show grants for jayg@localhost; +------------------------------------------------------------| Grants for ion@localhost +------------------------------------------------------------| GRANT ALL PRIVILEGES ON testul1.* TO ion@localhost +------------------------------------------------------------1 row in set (0.00 sec) + | + | +
44
Reincarcarea drepturilor MySQL citeste automat tabelele de privilegii cand e pornit si cand sunt date comenzi GRANT sau REVOKE. Modificarile facute manual tabelelor de drepturi nu iau efect decat daca se restarteaza MySQL. Ca sa functioneze aceste modificari reincarca tabelele:
flush privileges
sau
mysqladmin flush-privileges
sau
mysqladmin reload
sau
mysql> mysqlhotcopy database /path/director
Poti, de asemenea copia toate fisierele tabelelor (`*.frm', `*.MYD', and `*.MYI' files) cat timp serverul nu actualizeaza nimic. Poti face si backup-uri selective cu SELECT * INTO OUTFILE 'nume_fisier' FROM nume_tabela si sa restaurezi datele cu LOAD DATA INFILE 'nume_fisier' REPLACE ... Pentru a evita inregistrarile duplicat (inregistrarile noi le inlociesc pe cele mai vechi daca sunt identice in cazul comenzii REPLACE) ai nevoie de o cheie primara sau de o cheie unica.
Securitatea in MySQL
Securitatea e foarte importanta, in special cand vei conecta baza ta de date MySQL la site-ul Web. Cand rulezi MySQL ia in considerare urmatoarele sfaturi:
Nu da nimanui acces la tabela user ! Invata sistemul de privilegii al MySQL ! Tasteaza mysql -u root. Daca te poti conecta fara sa ti se ceara o parola, oricine poate face acelasi lucru. Vezi, in pagina de instalare cum se poate pune parola de root pe sever. Nu folosi parole din dictionar deoarece exista programe care le pot sparge! Foloseste initialele cuvintelor dintr-o propozitie (de exemplu aaum 'Ana are un miel') sau combinatii de pe tastatura (in loc de stefan-dyrgsm, adica o litera spre dreapta de pe tastatura). Investeste intr-un firewall. Foloseste parole pentru toti utilizatorii MySQL si ai grija in ce fisiere script le memorezi. Poti cripta parolele cu functiile PASSWORD() sau MD5(). La conectarea pe Web, ar trebui sa creezi un utilizator special numai pentru Web (de exemplu, sa aiba doar drepturi de SELECT pe tabela cu produse si de INSERT pe tabela cu comenzile facute). Daca utilizatorii care folosesc formularele de pe Web tasteaza date confidentiale, trebuie sa folosesti SSL (Secure Socket Layer) pentru ca altfel datele vor fi transmise spre server in fomatul text.
45
Optimizarea MySQL
Optimizeaza tabele care pot deveni fragmentate dupa multe actualizari si modificari cu OPTIMIZE
TABLE nume_tabela
Alege cel mai potrivit si cel mai scurt tip de date pentru campurile din tabele. Foloseste indecsi cand sunt necesari pentru a face interogarile mai rapide. Foloseste valori implicite in comanda INSERT Invata sa folosesti comanda EXPLAIN SELECT.. care arata ce se va intampla in cazul unei interogari. Nu uita ca privilegiile sunt citite la fiecare interogare. Deci, simplifica cat mai mult privilegiile acordate. Nu uita ca exista mai multe tipuri de tabele care pot fi create cu CREATE TABLE nume TYPE=tip (MyISAM-implicit, HEAP-temporar, BDB-sigure pentru tranzactii).
46
Configurarea MySQL
Schimbarea setului de caractere Mesaje de eroare in romana Utilitarele MySQL mysql mysqladmin mysqldump mysqlimport
Schimbarea setului de caractere Implicit, MySQL foloseste setul de caractere ISO-8859-1 Latin1 cu sortarea in orinea limbii suedeze. Pentru a schimba acest set implicit de caractere, foloseste comanda:
mysql> ./configure --with-charset=CHARSET
unde CHARSET poate fi big5, cp1251, cp1257, czech, danish, dec8, dos, euc_kr, gb2312, gbk, german1, hebrew, hp8, hungarian, koi8_ru, koi8_ukr, latin1, latin2, sjis, swe7, tis620, ujis, usa7, or win1251ukr. Pentru a adauga un nou set de caractere decide daca setul e unul simplu sau complex (are nevoie de sau nu de suport multi-byte) si: I.Set simplu: 1. Adauga SETUL la sfarasitul fisierului `sql/share/charsets/Index' si atribuie-i un numar. 2. Creaza un fisier `sql/share/charsets/SETUL.conf'. (Foloseste ca model `sql/share/charsets/latin1.conf'). 3. Adauga numele 'SETUL' la listele CHARSETS_AVAILABLE and COMPILED_CHARSETS din 'configure.in'. II.Set complex: 1. Creaza fisierul `strings/ctype-SETUL.c'. 2. Adauga SETUL la sfarasitul fisierului `sql/share/charsets/Index' si atribuie-i un numar. 3. Plaseaza un comentariu in partea de sus a fisierului creat la 1. :
4. 5. 6. 7. 8. /* * * * * */ This comment is parsed by configure to create ctype.c .configure. number_MYSET=MYNUMBER .configure. strxfrm_multiply_MYSET=N .configure. mbmaxlen_MYSET=N<
9. Creaza urmatoarele functii: my_strncoll_MYSET(), my_strcoll_MYSET(), my_strxfrm_MYSET(), my_like_range_MYSET(). 10. Adauga numele 'SETUL' la listele CHARSETS_AVAILABLE and COMPILED_CHARSETS din 'configure.in'.
47
Mesaje de eroare in alte limbi mysqld poatge da mesaje de eroare in urmatoarele limbi: ceha, daneza, engleza (implicit), estoniana, franceza, germana, greaca, italiana, japoneza, koreana, maghiara, norvegiana, norvegiana-ny, olandeza, poloneza, portugheza, romana, rusa, slovaca, spaniola si suedeza. Pentru a porni mysql in limba romana:
shell> mysqld --language=romanian
sau
shell> mysqld --language=/usr/local/share/romanian
Utilitarele MySQL
Sunt niste programe-client care se folosesc pentru a construi, configura si intretine bazele de date. myisamchk Descrie, verifica si optimizeaza tabele. make_binary_release Face un pachet binar cu dstrubutia MySQL. msql2mysql Converteste programe mSQL in MySQL. mysql mysqlaccess Verifica privilegii de acces pentru o combinatie de gazda-utilizator-baza de date. mysqladmin mysqlbug Genereaza un raport cu defectge (bugs) gasite in MySQL. mysqld Daemon-ul SQL. mysqldump mysqlimport mysqlshow Afiseaza informatii despre baze de date, tabele, coloane, indecsi. mysql_install_db Creaza tabelele de privilegii. replace Program utilitar care inlocuieste un sir de caractere cu al sir dintr-un anumit fisier.
shell> replace a b b a -- fisier1 fisier2 ...
mysql.exe
Este interfata in linie de comanda a MySQL-ului si-ti permite sa rulezi comenzi SQL sau comenzi
48
mysqladmin
Este utilitarul pentru sarcini administrative. Sintaxa:
mysqladmin [OPTIONS] command command...
49
kill id,id,... Termina thread-urile mysql password newpassword Schimba parola ping Verifica daca mysgld e pornit processlist Lista proceselor active reload Reincarca tabelele de privilegii refresh shutdown status variables Afiseaza variabilele disponibile version Versiunea MySQL slave-start Starteaza thread-ul slave (nou in v3.23) slave-stop Opreste thread-ul slave. (nou in v3.23) -? --help -# --debug=... -f --force Continua chiara daca apar erori -h --host=# -p[...] --password[=...] -P --port=... -I --sleep=sec Executa comenzile in continuu cu o pauza intre -r --relative Arata diferentele obtinute -s --silent Iesire daca nu e permisa conecatarea -t --timeout=... Timeout pentru conectare -w --wait[=retries] -W --pipe -E --vertical
Exemplu:
mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+-----| Id | User | Host | db | Command | Time | State | Info +----+-------+-----------+----+-------------+------+-------+-----| 6 | monty | localhost | | Processlist | 0 | | +----+-------+-----------+----+-------------+------+-------+-----Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K + | + | +
mysqldump
Este un utilitar pentru mutarea/stergerea informatiilor din tabele. Sintaxa:
mysqldump [OPTIONS] database [tables]
Optiuni:
-? -a --add-locks --add-drop-table --allow-keywords -c --delayed -F --help --all Adauga LOCK TABLES inainte si UNLOCK TABLE dupa fiecare dump
--complete-insert --flush-logs
50
-f --force -h --host=.. -l --lock-tables -t --no-create-info -d --no-data --opt -p[...] --password[=...] -P --port=port_num -q --quick -T path-to--tab=path-tocontinutul some-directory, some-directory --fields-terminated-by=... --fields-enclosed-by=... --fields-optionally-enclosed-by=... --fields-escaped-by=... --lines-terminated-by=... -u user_name, --user= user_name -w --where= wherecondition
mysqlimport
Este o interfata in linie de comanda pentru comanda SQL LOAD DATA INFILE. Sintaxa:
mysqlimport [options] database textfile1 [textfile2....]
Optiuni:
-? --help -d --delete --fields-terminated-by=... --fields-enclosed-by=... --fields-optionallyenclosed-by=... --fields-escaped-by=... --lines-terminated-by=... -f --force -h host_name --host=host_name -l --lock-tables -L --local -p[...] --password[=...] -P port_num --port=port_num -I --ignore luate in seama) -r --replace noua -s --silent -u user_name --user=user_name -c --columns=... Goleste tabela inainte de import
Trebuie specificat neaparat una din optiunile --ignore sau --replace, altfel, cand se vor gasi inregistrari duplicat in tabela si-n fiserul text se va genera o eroare.
51
Crearea tabelelor cu PHP Conectarea la baza de date Deschiderea bazei de date Executia comenzilor Adaugarea de inregistrari Formulare HTML Afisarea inregistrarilor Actualizarea inregistrarilor Functiile PHP pentru lucrul cu MySQL
Presupunem ca exemplu, o agenda cu datele vizitatorilor unui site memorata in tabela agenda cu structura: Nume id first last phone mobile fax email web Tip INT VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR Lungime 6 15 15 20 20 20 30 30 Descriere Un identificator unic Prenume Nume Numarul de telefon Numarul de mobil Numarul de fax Adresa de email Adresa de web
<? $user="nume"; $password="parola"; $database="baza_de_date"; mysql_connect(localhost,$user,$password); @mysql_select_db($database) or die( "Nu se poate deschide baza de date"); $query="CREATE TABLE agenda (id int(6) NOT NULL auto_increment, first varchar(15) NOT NULL, last varchar(15) NOT NULL, phone varchar(20) NOT NULL, mobile varchar(20) NOT NULL, fax varchar(20) NOT NULL, email varchar(30) NOT NULL, web varchar(30) NOT NULL, PRIMARY KEY (id),UNIQUE id (id), KEY id_2 (id))"; mysql_query($query); mysql_close(); ?>
Acum sa pargurgem pasii necesari pentru a putea folosi acesta tabela. Conectarea la baza de date:
$username="nume_utilizator"; $password="parola"; $database="baza_de_date"; mysql_connect(localhost,$username,$password);
Executia unei comenzi se poate face direct sau atribuind comanda unei variabile (daca se asteapta un rezultat):
mysql_query($query);
Adaugarea de inregistrari Informatiile urmatoare vor fi adaugate in agenda cu comanda: First: Ion Last: Gheorghe Phone: 01234 567890 Mobile: 00112 334455 Fax: 01234 567891 E-mail: [email protected] Web: http://www.inogh.go.ro
$query = "INSERT INTO agenda VALUES ('','Ion','Gheorghe','01234 567890','00112 334455','01234 567891','[email protected]','http://www.iongh.go.ro')";
Formularele HTML Iata cum ar putea sa arate un fomrular cu ajutorul caruia se vor culege informatii despre vizitatori:
53
Codul este:
<form action="insert.php" method="post"> Prenume: <input type="text" name="first"><br> Last Nume: <input type="text" name="last"><br> Telefon: <input type="text" name="phone"><br> Mobile: <input type="text" name="mobile"><br> Fax: <input type="text" name="fax"><br> E-mail: <input type="text" name="email"><br> Site Web:<input type="text" name="web"><br> <input type="Submit"> </form>
Afisarea inregistrarilor
$query="SELECT * FROM agenda"; $result=mysql_query($query);
Rezultatele sunt acum intr-un tablou ('result'). Pentru a-i afisa elementele, trebuie folosit un ciclu:
$num=mysql_numrows($result); $i=0; while ($i < $num) { COD PT AFISaRE ++$i; }
54
Actualizarea inregistrarilor 55
$id=$_GET['id']; $username="utilizator"; $password="parola"; $database="baza_de_date"; mysql_connect(localhost,$username,$password); $query=" SELECT * FROM agenda WHERE id='$id'"; $result=mysql_query($query); $num=mysql_numrows($result); mysql_close(); $i=0; while ($i < $num) { $first=mysql_result($result,$i,"first"); $last=mysql_result($result,$i,"last"); $phone=mysql_result($result,$i,"phone"); $mobile=mysql_result($result,$i,"mobile"); $fax=mysql_result($result,$i,"fax"); $email=mysql_result($result,$i,"email"); $web=mysql_result($result,$i,"web"); Spatiu pentru cod ++$i; }
Formularul HTML:
<form action="updated.php" method="post"> <input type="hidden" name="ud_id" value="<? echo "$id"; ?>"> Prenumele: <input type="text" value="ud_first" value="<? echo "$first"?>"><br> Numele: <input type="text" value="ud_last" value="<? echo "$last"?>"><br> Ner. telefon: <input type="text" value="ud_phone" value="<? echo "$phone"?>"><br> Nr. celular: <input type="text" value="ud_mobile" value="<? echo "$mobile"?>"><br> Nr. fax: <input type="text" value="ud_fax" value="<? echo "$fax"?>"><br> Adresa e-mail: <input type="text" value="ud_email" value="<? echo "$email"?>"><br> Adresa Web: <input type="text" value="ud_web" value="<? echo "$web"?>"><br> <input type="Submit" value="Actualizeaza"> </form>
Urmatorul pas este actualizarea propriu-zisa a bazei de date cu valorile introduse in formular:
$ud_id=$_POST['ud_id']; $ud_first=$_POST['ud_first']; $ud_last=$_POST['ud_last']; $ud_phone=$_POST['ud_phone']; $ud_mobile=$_POST['ud_mobile']; $ud_fax=$_POST['ud_fax']; $ud_email=$_POST['ud_email']; $ud_web=$_POST['ud_web']; $username="utilizator"; $password="parola"; $database="baza_de_date"; mysql_connect(localhost,$username,$password); $query="UPDATE agenda WHERE id='$ud_id' SET first='$ud_first' last='$ud_last' phone='$ud_phone' mobile='$ud_mobile' fax='$ud_fax' email='$ud_email' web='$ud_web'";
56
int
int
Inchide o conexiune
int
int
int
int
int
int
int
int
string
57
mysql_errno([int link_ identifier]) mysql_affected_rows([int link_identifier]) mysql_insert_id([int link_ identifier]) mysql_result(int result, int row [, mixed field]) mysql_num_rows(int result)
int
Afiseaza numarul mesajului de eroare de la operatia precedenta Preia numarul de inregistrari afectate de operatia precedenta Preia auto_incrementul precedentei comenzi INSERT Preia rezultatele interogarii
int
int
int
int
Preia numarul inregistrarilor din rezultat Preia numarul campurilor din rezultat Preia cate un rand din tabloul rezultat
mysql_fetch_object(int obiect result [, int result_type]) mysql_fetch_array(int tablou result [, int result_type]) mysql_data_seek(int result, int int row_number) mysql_fetch_lengths(int result) tablou
Preia marimea maxima a datelor din fiecare camp din rezultat Preia informatii despre campuri
mysql_fetch_field(int obiect result [, int field_offset]) mysql_field_seek(int result, int field_offset) mysql_field_name(int result, int field_index) mysql_field_table(int result, int field_offset) mysql_field_len(int result, int field_offet) mysql_field_type(int result, int field_offset) mysql_field_flags(int result, int field_offset) mysql_free_result(int result) int
string
string
int
string
string
int
58
Quiz MySQL
1. Care sunt cele mai folosite sisteme de operare pe serverele Web? a.Windows 95/98 b.Windows NT/UNIX c. Linux si OS/2 2. De ce sistem de operare ai nevoie pentru MySQL? a.Linux b.UNIX c.Windows 2000 d. Windows XP e. Merge pe majoritatea 3.Care server de mai jos e produs de Microsoft? a.IIS b.Apache c.Xitami 4.PHP,ASP si Perl fac parte din aceeasi categorie. Care ? a.hardware b.software c.servere Web d.middleware 5. Ce este MySQL ? a.un browser Web b.un program de chat c.un program de vazut filme d.un server pentru baze de date e.un sistem de operare 6.Cum se mai numesc coloanele dintr-o tabela ? a.campuri b.linii c.randuri d.aliasuri
59
7.Cate tipuri de relatii pot exista intr-o baza de date relationala? a.1 b.2 c.3 d.4 e.5 8.De unde poti downloada gratuit MySQL ? a.www.apache.org b.www.php.net c. www.my-sql.go.ro d.www.mysql.com 9.Cum se numeste interfata vizuala principala a serverului MySQL? a.mysqldump b.mysql c.mysqladmin d.mysqlimport 10.Care metoda de instalare nu merge pe un sistem Linux? a.InstallShield b.RPM-uri c.compilarea distrubitiei sursa 11.Cu ce se termina fiecare comanda SQL? a.: b.# c.\ d.; e.? 12.Crearea dreputurilor pentru un utilizator se face cu: a.Revoke b.Grant c.Give right d.User() e.Alter User
60
13.Ce face comanda INSERT ? a.Actualizeaza inregistrari b. Adauga inregistrari c.Modifica inregistrari 14.Sintaxa comenzii SELECT este: a.Select from nume_tabela IN nume_camp b.Select nume_tabela Where nume_camp from nume_tabela c.Select nume_camp from nume_tabela where conditii 15.Sortarea datelor extrase se face cu: a.Order By b.Having c.Group By 16.Care este tipul de tabela implicit in MySQL? a.ISAM b.HEAP c.MyISAM d.BDB 17.Ce afiseaza urmatoarea secventa de escape:\b? a.\ b.B c.b d.beep 18.Care functie nu este folosite pentru compararea de siruri? a.IFNULL b.STRCMP c.REGEXP 19.Cum poti obtine data si ora din aceasta clipa? a.CURDATE() b.NOW c.CURTIME() d.TIME_FORMAT
61
20.Ce au in comun tabelele db, user si host? a.Nimic b.Sunt tabele de grant c.Sunt tabele read-only 21.Cum se poate afla ce drepturi are un utilizator? a.Intrebandu-l b.cu SHOW GRANTS c.citind Constitutia d.cu DESCRIBE user 22. Care este setul de caractere folosit implicit de MySQL? a.Latin b.Romn c.Suedez d.Englez e.Maghiar 23.Ce face programul client mysqlbug? a.Strica MySQL b.Afiseaza toate bug-urile din MySQL c.Bzie d.Genereaza raport pentru un bug 24.Ce face comanda echo? a.Afiseaza o variabila/valoare b. Repeta o valoare ca un ecou c.Scrie in memorie 25.Care este adresa de Web a acestui site? a.www.my-sql.ro b.www.mysql.com c.www.mysql.go.ro d.www.my-sql.go.ro
62
Linkuri utile
Site-ul oficial MySQL (MySQL.com) Tot ce trebuie sa stii despre MySQL. MYSQL - Download (http://www.mysql.com/downloads/) Locul unde gasesti ultima versiune de MySQL in orice forma (pt Windows, rpm-uri, sau distributia sursa). Manualul MySQL (http://www.mysql.com/documentation/) Manualul oficial al MySQL-ului in diferite formate contine totul despre instalare, erori, serverul MYSQL, limbajul MYSQL etc. Unelte ajutatoare pt MySQL (http://www.mysql.com/downloads/contrib.html) Foarte multe unelte de care te folosesti pentru a lucra mai bine si mai usor cu MySQL. De exemplu :LaunchMySQL-program pentru lansarea server-ului MySQL sau DBF2MySQL-program pentru convertirea tabelelor din FoxPro in tabele MySQL. MySQL Mailing List ([email protected]) Inscriere in lista de mail-uri MySQL de unde vei primi e-mail-uri de la alti utilizatori MySQL, vei particpia la discutii despre MySQL etc. Site-ul oficial PHP (PHP.net) Totul despre PHP. PHP - Download (http://www.php.net/downloads) Ultimele versiuni de PHP in diferite formate. Manualul PHP (http://www.php.net/manual/) Manualul online contine tot ce trebuie sa stii despre PHP - de la o instalare perfecta pana la folosirea PHP pentru dezvoltarea unro aplicatii complexe. PHPBuilder (PHPBuilder.com) Un site excelent cu articole despre PHP si baze de date, plus o librarie de script-uri pe care le poti folosi gratuit. Site-ul oficial al Apache (Apache.org) Site-ul oficial al Apache Software Foundation, care include multe proiecte interesante, mai ales din spatiul XML. Poti copia ultima versiune a server-ului Apache. GNU - General Public Licence (GNU.org) Licenta sub care sunt distribuite produsele Open Source PHP, Apache si MySQL.
63