Dezvoltat de | D. Richard Hipp |
---|---|
Prima versiune | August 2000 |
Ultima versiune | 3.36.0 (18 iunie 2021) |
Depozit | www.sqlite.org/src |
Scris in | VS |
Sistem de operare | Multiplatform |
Citiți formatele | Format fișier bază de date SQLite ( d ) , bază de date SQLite 3.x ( d ) și jurnal SQLb rollbak ( d ) |
Formate scrise | Format fișier bază de date SQLite ( d ) , bază de date SQLite 3.x ( d ) , bază de date comprimată SQLite Zipvfs ( d ) și jurnal SQLb rollbak ( d ) |
Tip | Sistem de gestionare a bazelor de date la bord ( d ) |
Licență | Domeniu public |
Site-ul web | sqlite.org |
SQLite (pronunțat [ ɛs.ky.ɛl.ajt ]) este o bibliotecă scrisă în limbajul C care oferă motor delimbaj SQL accesibil bazei de date relaționale . SQLite implementează în mare măsură standardul SQL-92 și proprietățile ACID .
Spre deosebire de serverele de baze de date tradiționale, cum ar fi MySQL sau PostgreSQL , particularitatea sa nu este de a reproduce schema obișnuită client-server , ci de a fi direct integrat în programe . Întreaga bază de date (declarații, tabele, index și date) este stocată într-un fișier independent de platformă .
D. Richard Hipp , creatorul SQLite, a ales să plaseze această bibliotecă și codul său sursă în domeniul public , ceea ce permite utilizarea sa nerestricționată atât în proiecte open source cât și în proiecte proprietare . Creatorul și unii dintre principalii dezvoltatori ai SQLite sunt angajați de compania americană Hwaci .
SQLite este cel mai utilizat motor de baze de date din lume, datorită utilizării sale:
Datorită ușurinței sale extreme (mai puțin de 600 KiB ), este, de asemenea, foarte popular pe sistemele încorporate , în special pe majoritatea smartphone-urilor și tabletelor moderne: sistemele de operare mobile iOS , Android și Symbian îl folosesc ca bază de date. În total, putem număra mai mult de un miliard de exemplare cunoscute și raportate ale bibliotecii.
D. Richard Hipp și un coleg au început să proiecteze SQLite la începutul anului 2000 în timp ce lucrau la General Dynamics , apoi sub contract cu Marina SUA . SQLite urma să fie utilizat în rachetele ghidate , pentru a înlocui bazele de date IBM Informix care rulează pe mașinile HP-UX . Obiectivul principal era să poți face fără nicio instalare sau administrare: instalarea sau actualizarea bazei de date ar putea dura o zi întreagă.
În august 2000, a fost lansată prima versiune a SQLite. Ea a fost folosind GDBM ( GNU Database Manager) pentru a manipula copaci B .
SQLite 2.0 elimină dependența de gdbm și adaugă suport pentru tranzacții.
SQLite 3.0, produs cu ajutorul AOL , a fost lansat în 2004 și adaugă, printre altele, regionalizarea (cu colaționare și suport Unicode ) și declarația de tip.
Majoritatea sistemelor de gestionare a bazelor de date sunt construite în conformitate cu paradigma client-server , adică o bibliotecă software client este integrată și utilizată în una sau mai multe aplicații în timp ce motorul bazei de date rulează .în propriul spațiu de execuție, sau chiar pe o altă mașină, ca departament IT .
SQLite, dimpotrivă, este direct integrat în aplicația care folosește biblioteca sa software, cu motorul său de baze de date. Accesul la o bază de date cu SQLite se face prin deschiderea fișierului corespunzător: fiecare bază de date este salvată într-un fișier care îi este specific, cu declarațiile sale, tabelele și indexurile sale, dar și datele sale.
Această caracteristică face SQLite interesant ca alternativă la fișierele text, utilizat ca mijloc de stocare integrată în multe aplicații ( parametri , istoric , cache ...), deoarece face accesul la date mai rapid, mai sigur, mai structurat, mai ușor și complet independent de platformă , fără a afecta însă ușurința implementării aplicației care o folosește.
Eliminarea intermediarului între aplicație și date reduce, de asemenea, ușor latența accesului la date comparativ cu sistemele care utilizează paradigma client-server.
Cu toate acestea, această arhitectură pune mai multe probleme:
Nu există nici o anumită extensie pentru fișierele bazei de date SQLite, dar este comun pentru extensii întâlni , cum ar fi .sqlite sau .db , uneori , urmat de numărul versiunii bibliotecii ( .sqlite3 , .db2 , etc). Este posibil să se utilizeze o bază de date salvate numai în memoria RAM , fără a crea fișier de baze de date de pe disc, prin numele de fișier special : memorie: .
În general, este recomandabil să utilizați SQLite acolo unde datele nu sunt centralizate și unde extinderea dimensiunii bazei de date nu este probabil să devină critică. Dacă scopul bazei de date este de a centraliza o masă mare de date și de a le furniza unui număr mare de clienți, este de preferat să utilizați SGBD bazate pe paradigma client-server. SQLite este destinat să înlocuiască fișierele text, nu serverele tradiționale de baze de date.
Când o interogare SQL este transmisă către SQLite prin interfața de programare , aceasta este compilată înainte de a fi executată.
Secvențialul compilatorului împarte comenzile date în părți care pot fi procesate separat (o interogare și subinterogarea sa de exemplu), care sunt transmise analizatorului care se ocupă de împărțirea interogărilor în diferite obiecte care reprezintă diferitele ordine. Și clauze ale limbajului SQL. Aceste obiecte sunt transmise generatorului de cod care creează un cod intermediar de nivel scăzut, sau bytecode .
Codul rezultat este un set de instrucțiuni (137 instrucțiuni diferite) numite OpCodes . Acest lucru este lansat în mașina virtuală SQLite, care le vede ca fiind programe mici care descriu operațiile de căutare, citire și modificare a datelor.
Când interpretii mașinii virtuale aceste instrucțiuni, ea a numit managerul de B-arbore bazat pe straturi de nivel care reduce ascunde paginile de disc și stratul de abstractizare hardware - ului .
SQLite nu integrează gestionarea drepturilor de acces și modificarea datelor. Gestionarea se face de către sistemul de fișiere al sistemului de operare : dacă fișierul care conține baza de date nu este înscriibil pentru un utilizator, acesta va putea, de asemenea, să modifice înregistrările și structura de bază a datelor.
Gestionarea drepturilor cu GRANT și REVOKE este, prin urmare, inexistentă, deși acestea fac parte din specificația SQL-92 .
Utilizarea unei baze de date SQLite nu necesită nicio procedură de instalare sau configurare.
Biblioteca este scrisă în întregime în C-ANSI , versiunea standardizată a limbajului de programare C și nu folosește alte biblioteci, altele decât biblioteca de limbaj standard . Acest lucru face SQLite compilabil fără modificări majore pe toate arhitecturile computerului, oferind un compilator C care respectă standardul ANSI.
Fișierele bazei de date SQLite sunt complet independente de sistemul de operare și de arhitectura pe care sunt utilizate. Același fișier de bază de date poate fi utilizat pe două arhitecturi cu funcționare radical diferită, SQLite asigurând un strat transparent de abstractizare pentru dezvoltator. Fișierele sunt compatibile între ele pentru fiecare versiune majoră a bibliotecii de la versiunea 3.0.0 a SQLite, deci un fișier creat cu versiunea 3.0.0 va putea fi utilizat cu versiunea 3.6.19 și invers, fișiere create între două versiuni majore diferite ( 2.0.0 și 3.0.0 de exemplu) pot fi compatibile (mai ales în compatibilitatea cu versiunile anterioare), dar nu este întotdeauna cazul.
SQLite folosește tastarea dinamică pentru conținutul celulei, spre deosebire de aproape toate DBMS-urile care utilizează tastarea statică : la crearea unui nou tabel în baza de date, este un tip recomandat sau de afinitate, nu forțat, al datelor care trebuie stocate în coloana care este completată și nu un tip care definește modul în care aceasta va fi reprezentată în memorie, această sarcină fiind rezervată celulei în sine. Când datele sunt introduse în baza de date, SQLite va încerca să convertească noile date la tipul recomandat, dar nu va face acest lucru dacă acest lucru nu este posibil.
Există mai multe tipuri de afinitate în SQLite, acestea definind modul în care SQLite va funcționa atunci când introduceți date noi:
Astfel, fiecare tip de afinitate poate accepta orice tip de date, singura excepție este tipul cheie INTEGER PRIMARY KEY , atunci când este aplicat pe o singură coloană, deoarece nu este un tip obișnuit, ci de la un alias la coloana internă la Motor ROWID care corespunde adresei înregistrării, unic peste masă.
Utilizarea tastării dinamice îmbunătățește omogenitatea între datele din baza de date și tipurile de limbaj utilizate pentru interogarea acesteia dacă acesta din urmă este, de asemenea, un limbaj tipizat dinamic (cum ar fi Python , PHP , Perl sau Ruby ) fără a pune probleme reale cu limbi folosind tastarea statică (cum ar fi C / C ++ sau Java ).
Determinarea tipului de afinitatePentru a menține compatibilitatea cu alte baze de date relaționale , SQLite convertește automat numele tipurilor declarate în cel mai potrivit tip de afinitate, după cum urmează:
Deși SQLite utilizează tastarea dinamică, reprezentarea în memorie și procesarea datelor necesită utilizarea diferitelor clase de stocare. Acest lucru este valabil doar pentru versiunea 3 și versiunile sale ulterioare, deoarece datele au fost salvate ca șiruri în versiunile anterioare.
Toate datele manipulate de Motorul de baze de date utilizează unul dintre următoarele tipuri:
Standardul nu definește exact cum ar trebui tratat tipul NULL .
La fel ca în majoritatea bazelor de date relaționale, toate înregistrările NULL sunt considerate distincte prin constrângerea UNIQUE , dar sunt considerate identice de operatorul UNION și de cuvântul cheie DISTINCT .
Operațiile aritmetice care includ un tip NULL în expresia lor returnează necunoscut (valoare nedefinită). În operațiile booleene , valoarea de returnare ar putea fi NECUNOSCUTĂ dacă apare un tip NULL și rezultatul nu poate fi determinat cu certitudine: NULL SAU 1 va da valoarea 1 , dar NULL SAU 0 va da valoarea NECUNOSCUTĂ deoarece operațiunea nu poate fi rezolvată cu certitudine .
DateleSQLite nu are un tip care să reprezinte datele. Cu toate acestea, există un set de funcții pentru a le manipula. Stocarea unei date se poate face într-un șir de caractere în forma ISO 8601 sau într-un număr întreg sub forma unui timestamp UNIX .
SQLite gestionează constrângerile de pe una sau mai multe coloane. Constrângerile NOT NULL , CHECK , DEFAULT și COLLATE sunt declarate pe coloană în timp ce constrângerile PRIMARY KEY , UNIQUE , CHECK și FOREIGN KEY pot fi declarate pe una sau mai multe coloane.
Constrângerea UNIQUE creează automat un index pe coloana (coloanele) căreia i se aplică.
CHEIA PRINCIPALAConstrângerea cheii primare va crea o constrângere UNICĂ pe coloana (coloanele) afectată (e), însă, spre deosebire de standard , constrângerea PRIMARY KEY a SQLite permite intrări care sunt NULL . Aceasta este o neconformitate cu standardul, iar această abatere ar putea fi rezolvată în versiunile viitoare. Prin urmare, este recomandabil să adăugați constrângerea NOT NULL la declarația unei chei primare.
ROWID și AUTOINCREMENTFiecare rând dintr-un tabel este identificat printr-un întreg semnat pe 64 de biți numit ROWID . Când un tabel este declarat cu o singură coloană INTEGER PRIMARY KEY , această coloană devine un alias al ROWID . Utilizarea unui alias cu identificatorul ROWID crește viteza căutărilor, care poate fi de până la două ori mai rapidă decât cu o cheie primară normală asociată cu indicele său de unicitate.
Când tabelul este gol, algoritmul atribuie valoarea 1 identificatorului, pe care îl crește pentru fiecare înregistrare nouă, până când atinge limita unui număr întreg semnat pe 64 de biți ( ). Odată ce această limită este atinsă, va reutiliza spațiile eliberate de înregistrările șterse. Prin urmare, alocarea identificatorilor nu mai este incrementală, ci aleatorie.
Este posibil să utilizați cuvântul cheie AUTOINCREMENT . Acesta din urmă modifică ușor algoritmul: odată atinsă limita unui număr întreg, nu va mai fi posibilă inserarea unei noi înregistrări. Acest lucru face posibilă garantarea că același identificator nu va fi purtat niciodată de două înregistrări distincte, chiar dacă acestea nu coexistă în același timp.
CHEIE EXTERNĂDe la versiunea 3.6.19 , SQLite este capabil să gestioneze constrângerile cheii străine .
Din motive de compatibilitate inversă, suportul pentru chei străine nu este activat în mod implicit. Activarea se face prin pragma foreign_keys .
Orice coloană la care se face referire printr-o cheie străină trebuie declarată ca UNICĂ ( CHEIA PRIMARĂ creează o cheie unică ). SQLite nu ia încă în considerare clauza MATCH în definiția cheilor străine.
SQLite gestionează declanșatoarele într-un mod destul de complet. Pot fi raportate declanșatoarele ÎNAINTE , DUPĂ sau ÎN loc de . SQLite acceptă opțiunea FOR EACH ROW (operație implicită), dar nu FOR FIECARE DECLARAȚIE .
SQLite permite crearea de vizualizări pentru a reduce durata interogărilor.
Vizualizările sunt numai în citire, dar este posibil să utilizați declanșatoare cu proprietatea INSTEAD OF pentru a simula capacitatea de a le modifica.
Toate comenzile SQL care vizează schimbarea stării bazei de date (aproape orice altă comandă decât SELECT ) implică crearea unei tranzacții dedicate acestora, atâta timp cât o tranzacție care include comanda nu este deja creată. Aceasta înseamnă că toate comenzile sunt atomice . Dacă executarea comenzii nu provoacă o eroare, modificarea este comisă automat ( autocommit ), dar dacă nu este cazul, toate modificările făcute de comandă sunt anulate.
Toate modificările aduse bazei de date sunt serializate: se efectuează o singură modificare odată și baza de date este blocată pentru citire în timpul unei modificări.
SQLite permite crearea de tranzacții, precum și crearea de puncte de returnare ( SAVEPOINT ), dar nu permite gestionarea diferitelor grade de izolare. Într-o tranzacție, în timpul primului apel la o comandă de citire, este activată o blocare partajată care autorizează accesul la citire, dar interzice orice modificare a datelor de către o altă tranzacție, în timpul primului apel de scriere, întreaga bază de date este citită și scriere blocată pentru alte tranzacții .
ACIDChiar dacă SQLite la prima vedere respectă setul de proprietăți ACID , care determină fiabilitatea unui sistem tranzacțional, este totuși posibil să puneți baza de date într-o stare inconsistentă, deoarece tipurile nu sunt forțate: este posibil, de exemplu, să introduceți un șir de caractere dintr-o coloană al cărui tip de afinitate este definit ca un întreg . În interpretările lor stricte, SQLite nu respectă setul de proprietăți ACID.
SQLite permite crearea de tabele temporare a căror definiție, date și indexuri nu sunt salvate în fișierul bazei de date și, prin urmare, se pierd atunci când baza de date este închisă.
Este posibil să creați, direct din bibliotecă, propriul motor de stocare pentru a simula un tabel de baze de date. Crearea unui tabel virtual se face prin implementarea unui set de funcții. Accesul la masă este complet transparent, în afară de absența anumitor funcționalități (imposibil să se creeze declanșatoare sau indici sau să se modifice structura tabelului).
Acest mecanism permite accesul utilizând limbajul SQL la orice tip de sursă de date, cum ar fi fișierele CSV sau XML .
SQLite oferă o interfață de programare, prin biblioteca sa, pentru crearea funcțiilor utilizatorului. Setul de funcții definit de bibliotecă poate fi suprasolicitat , pentru a redefini implementarea acestora. Unii operatori, cum ar fi LIKE, folosesc funcții omonime ca un sub-strat, care poate fi, de asemenea, înlocuit cu funcții definite de utilizator.
SQLite nu acceptă crearea de proceduri , dar nevoia lor este mai mică datorită arhitecturii încorporate.
SQLite permite crearea de indici pe una sau mai multe coloane. Indicii pot fi crescători ( ASC ) sau descendenți ( DESC ), precum și unici (acest lucru este similar cu crearea unei constrângeri de unicitate). SQLite folosește arborele B al indexului .
SQLite introduce cuvântul cheie EXPLAIN care este folosit pentru a descrie pașii necesari pentru a executa o comandă, precum și indexurile utilizate.
Pragmele sunt perechi cheie / valoare de configurare SQLite. Acestea sunt interne unei baze de date și vă permit să descrieți cum SQLite ar trebui să interpreteze anumite operațiuni. De asemenea, vă permit să activați sau să dezactivați anumite funcții, în special din motive de compatibilitate inversă.
În afară de implementarea sa oficială în C , există legături pentru alte limbi ( C ++ , Perl , Ruby , TCL , limbi folosind cadrul .NET prin intermediul unui driver ADO.NET ...).
Unele limbaje de programare includ SQLite în biblioteca lor standard , de exemplu, Python (din versiunea 2.5) și PHP (din versiunea 5).
SQLite este utilizat în multe software-uri gratuite, cum ar fi Mozilla Firefox , în multe distribuții GNU / Linux , în sisteme de operare pentru server și desktop , cum ar fi Solaris sau mobile, cum ar fi Android sau Symbian , în unele programe de la Apple , Google , Adobe și McAfee , precum și unele dispozitive Philips .
SQLite este disponibil și cu versiunea 8.4 a software-ului Primavera P6 de la Oracle.
Proiectul privind stocarea unei baze de date SQL pe partea browserului web publicat de W3C afirmă, de asemenea, că software-ul care implementează această caracteristică trebuie să poată interpreta corect dialectul SQLite în versiunea sa 3.6.19 . Deși SQLite nu este pus în aplicare de W3C, Google Chrome , Apple Safari și Opera Browser îl folosesc în acest scop.
SQLite există în 2 versiuni principale: 2.x și 3.x. Versiunile SQLite 2 și 3 se disting prin mai multe evoluții: