tarafından geliştirildi | D. Richard Hipp |
---|---|
İlk versiyon | Ağustos 2000 |
Son sürüm | 3.36.0 (18 Haziran 2021) |
Depozito | www.sqlite.org/src |
Yazılmış | VS |
İşletim sistemi | Çoklu platform |
Formatları oku | SQLite veritabanı dosya formatı ( d ) , SQLite 3.x veritabanı ( d ) ve SQLite rollbak günlüğü ( d ) |
Yazılı biçimler | SQLite veritabanı dosya formatı ( d ) , SQLite 3.x veritabanı ( d ) , SQLite Zipvfs sıkıştırılmış veritabanı ( d ) ve SQLite rollbak günlüğü ( d ) |
Tip | Yerleşik veritabanı yönetim sistemi ( d ) |
Lisans | Kamu malı |
İnternet sitesi | sqlite.org |
SQLite ([ ɛs.ky.ɛl.ajt ] olaraktelaffuz edilir) C dilinde yazılmış, ilişkisel veritabanı erişilebilir dil SQL motorunu sunanbir kütüphanedir . SQLite, büyük ölçüde SQL-92 standardınıve ACID özelliklerini uygular.
MySQL veya PostgreSQL gibi geleneksel veritabanı sunucularından farklı olarak , özelliği olağan istemci-sunucu şemasını yeniden oluşturması değil, doğrudan programlara entegre edilmesidir . Veritabanının tamamı (bildirimler, tablolar, dizin ve veriler) platformdan bağımsız bir dosyada saklanır .
D. Richard Hipp , SQLite yaratıcısı, bu kitaplığı ve koymayı seçmiştir kaynak kodu içinde kamu malı hem de onun sınırsız kullanımına izin verir, açık kaynak ve müseccel projelerde . SQLite'ın yaratıcısı ve ana geliştiricilerinden bazıları, Amerikan şirketi Hwaci tarafından istihdam edilmektedir .
SQLite, kullanımı sayesinde dünyanın en çok kullanılan veritabanı motorudur:
Aşırı hafifliği (600 KiB'den az ) nedeniyle, gömülü sistemlerde , özellikle çoğu modern akıllı telefon ve tablette çok popülerdir : iOS , Android ve Symbian mobil işletim sistemleri onu bir veritabanı olarak kullanır. gömülü. Toplamda, kütüphanenin bilinen ve rapor edilen bir milyardan fazla kopyasını sayabiliriz.
D. Richard Hipp ve bir meslektaşı, 2000 yılının başlarında General Dynamics'te çalışırken , daha sonra ABD Donanması ile sözleşmeli olarak SQLite tasarlamaya başladı . SQLite, HP-UX makinelerinde çalışan IBM Informix veritabanlarının yerini almak için güdümlü füzelerde kullanılacaktı . Ana amaç, herhangi bir kurulum veya yönetim olmaksızın yapabilmekti: veritabanının kurulumu veya güncellenmesi bütün bir gün sürebilir.
Ağustos 2000'de SQLite'ın ilk sürümü yayınlandı. O kullanıyordu gdbm ( GNU manipüle Veritabanı Yöneticisi) B ağaçları .
SQLite 2.0, gdbm'ye olan bağımlılığı ortadan kaldırır ve işlem desteği ekler.
AOL yardımıyla üretilen SQLite 3.0, 2004'te piyasaya sürüldü ve diğer şeylerin yanı sıra bölgeselleştirme ( harmanlama ve Unicode desteği ile ) ve tür bildirimi ekler .
Çoğunluk veritabanı yönetim sistemlerinin göre inşa edilir istemci-sunucu paradigması , yani bir istemci yazılım kütüphanesi ise bir veya birden fazla uygulamalarda entegre ve kullanılan veritabanı altyapısı olan çalışan. Kendi yürütme uzayda, hatta farklı bir makinede, bir şekilde BT bölümü .
SQLite ise tam tersine, veritabanı motoru ile yazılım kütüphanesini kullanan uygulamaya doğrudan entegre edilmiştir. SQLite ile bir veritabanına erişim, kendisine karşılık gelen dosyanın açılması ile sağlanır: her veritabanı, bildirimleri, tabloları ve indeksleri ile aynı zamanda verileri ile kendisine özel bir dosyaya kaydedilir.
Bu özellik, birçok uygulamada ( parametreler , geçmiş , önbellek ...) tümleşik depolama aracı olarak kullanılan metin dosyalarına alternatif olarak SQLite'ı ilginç kılar , çünkü verilere erişimi daha hızlı, daha güvenli, daha yapılandırılmış, daha kolay ve eksiksiz hale getirir. platformdan bağımsız olarak, onu kullanan uygulamanın dağıtım kolaylığını etkilemez.
Uygulama ve veri arasındaki aracıyı kaldırmak, istemci-sunucu paradigmasını kullanan sistemlere kıyasla veri erişim gecikmesini de biraz azaltır.
Ancak, bu mimari birkaç sorun ortaya çıkarmaktadır:
SQLite veritabanı dosyaları için belirli bir uzantı yoktur , ancak .sqlite veya .db gibi uzantılarla ve bazen kitaplığın sürüm numarasıyla ( .sqlite3 , .db2 , vb.) karşılaşılması yaygındır . Özel dosya adı : memory: aracılığıyla diskte veritabanı dosyası oluşturmadan yalnızca RAM'de kayıtlı bir veritabanını kullanmak mümkündür .
Genel olarak, verilerin merkezileştirilmediği ve veritabanı boyutunun genişletilmesinin kritik hale gelmeyeceği durumlarda SQLite kullanılması tavsiye edilir. Veritabanının amacı, büyük miktarda veriyi merkezileştirmek ve çok sayıda istemciye sağlamaksa, istemci-sunucu paradigmasına dayalı DBMS'lerin kullanılması tercih edilir . SQLite, geleneksel veritabanı sunucularını değil, metin dosyalarını değiştirmeyi amaçlamaktadır.
Bir SQL sorgusu, programlama arabirimi aracılığıyla SQLite'a iletildiğinde , yürütülmeden önce derlenir .
Derleyicinin sıralayıcısı , verilen komutları ayrı olarak işlenebilecek parçalara böler (örneğin, bir sorgu ve onun alt sorgusu), bunlar , sorguları farklı siparişleri temsil eden farklı nesnelere bölmekle ilgilenen ayrıştırıcıya iletilir . ve SQL dilinin tümceleri. Bu nesneler, düşük seviyeli bir ara kod veya bayt kodu oluşturan kod oluşturucuya iletilir .
Ortaya çıkan kod, OpCodes adı verilen bir dizi talimattır (137 farklı talimat) . Bu, onları veri arama, okuma ve değiştirme işlemlerini açıklayan küçük programlar olarak gören SQLite'ın sanal makinesinde başlatılır.
Sanal makine bu talimatları yorumladığında , sayfa diskini ve donanım soyutlama katmanını gizleyen alt katmanlara dayalı B-ağacı yöneticisini çağırdı .
SQLite, erişim haklarının yönetimini ve veri değişikliğini entegre etmez. Yönetim tarafından yapılır dosya sistemi içinde işletim sistemi : veritabanını içeren dosya bir kullanıcıya yazılabilir değilse, kullanıcı da değiştirmek mümkün olacak kayıtlarını ve verilerin temel yapısını.
Bu nedenle , GRANT ve REVOKE ile hak yönetimi yoktur , ancak bunlar SQL-92 belirtiminin bir parçasıdır .
SQLite veritabanı kullanmak herhangi bir kurulum veya yapılandırma prosedürü gerektirmez.
Kitaplık tamamen C programlama dilinin standartlaştırılmış versiyonu olan C-ANSI ile yazılmıştır ve standart dil kitaplığı dışında herhangi bir harici kitaplık kullanmaz . Bu, SQLite'ı ANSI standardına uygun bir C derleyicisi sağlayan tüm bilgisayar mimarilerinde büyük bir değişiklik yapılmadan derlenebilir hale getirir .
SQLite veritabanı dosyaları, işletim sisteminden ve kullanıldıkları mimariden tamamen bağımsızdır. Aynı veritabanı dosyası, kökten farklı işlemlere sahip iki mimaride kullanılabilir; SQLite , geliştirici için şeffaf bir soyutlama katmanı sağlar. Dosyalar, SQLite'ın 3.0.0 sürümünden bu yana kitaplığın her ana sürümü için birbiriyle uyumludur , bu nedenle 3.0.0 sürümüyle oluşturulan bir dosya, 3.6.19 sürümüyle kullanılabilir ve bunun tersi, iki farklı ana sürüm arasında oluşturulan dosyalar ( örneğin 2.0.0 ve 3.0.0 ) uyumlu olabilir (özellikle geriye dönük uyumlulukta), ancak bu her zaman böyle değildir.
SQLite, statik yazma kullanan hemen hemen tüm DBMS'lerin aksine, hücre içeriği için dinamik yazmayı kullanır : veritabanında yeni bir tablo oluştururken, doldurulan sütunda depolanacak verilerin zorunlu olmayan önerilen veya yakınlık türüdür. ve bunun bellekte nasıl temsil edileceğini tanımlayan bir tür değil, bu görev hücrenin kendisine ayrılmıştır. Veritabanına veri girildiğinde, SQLite yeni verileri önerilen türe dönüştürmeye çalışacak ancak bu mümkün değilse bunu yapmayacaktır.
SQLite'de, yeni veri girerken SQLite'ın nasıl çalışacağını tanımlayan birkaç yakınlık türü vardır:
Bu nedenle, her yakınlık türü herhangi bir veri türünü kabul edebilir, tek istisna, tek bir sütuna uygulandığında belirli bir INTEGER PRIMARY KEY türüdür , çünkü normal bir tür değildir. Tabloda benzersiz, kaydın adresine karşılık gelen ROWID motoru .
Dinamik yazmanın kullanılması, veritabanındaki veriler ile onu sorgulamak için kullanılan dilin türleri arasındaki homojenliği iyileştirir, eğer ikincisi aynı zamanda dinamik olarak yazılmış bir dilse ( Python , PHP , Perl veya Ruby gibi ), herhangi bir gerçek sorun oluşturmadan. statik yazmayı kullanan diller ( C / C++ veya Java gibi ).
Afinite türünün belirlenmesiDiğer ilişkisel veritabanlarıyla uyumluluğu korumak için SQLite, bildirilen türlerin adlarını aşağıdaki gibi en iyi eşleşen yakınlık türüne otomatik olarak dönüştürür:
SQLite dinamik yazmayı kullanmasına rağmen, bellek içi gösterim ve veriler üzerinde gerçekleştirilen işleme, farklı depolama sınıflarının kullanılmasını gerektirir. Veriler önceki sürümlerde dizeler olarak kaydedildiğinden, bu yalnızca sürüm 3 ve sonraki sürümleri için geçerlidir.
Veritabanı Altyapısı tarafından işlenen tüm veriler aşağıdaki türlerden birini kullanır:
Standart, NULL türünün nasıl ele alınacağını tam olarak tanımlamaz .
İlişkisel veritabanlarının çoğunda olduğu gibi, tüm NULL kayıtları UNIQUE kısıtlaması tarafından farklı kabul edilir, ancak UNION operatörü ve DISTINCT anahtar sözcüğü tarafından aynı kabul edilir .
İfadelerinde NULL türü içeren aritmetik işlemler UNKNOWN (tanımsız değer) döndürür . Gelen Boole operasyonlar , dönüş değeri olabilir BİLİNMEYEN bir eğer NULL türü : oluşur ve sonuç kesinlik ile tespit edilemeyen NULL VEYA 1 değeri verecektir 1 , fakat NULL VEYA 0 değeri verecektir BİLİNMİYOR operasyon kesin olarak çözülemeyen çünkü .
TarihSQLite, tarihleri temsil edecek bir türe sahip değildir. Ancak, bunları işlemek için bir dizi işlev mevcuttur. Bir tarihin saklanması, ISO 8601 biçimindeki bir karakter dizisinde veya UNIX zaman damgası biçiminde bir tamsayıda yapılabilir .
SQLite, bir veya daha fazla sütundaki kısıtlamaları yönetir. NOT NULL , CHECK , DEFAULT ve COLLATE kısıtlamaları sütunda bildirilirken, PRIMARY KEY , UNIQUE , CHECK ve FOREIGN KEY kısıtlamaları bir veya daha fazla sütunda bildirilebilir.
UNIQUE kısıtlaması , uygulandığı sütun(lar)da otomatik olarak bir dizin oluşturur .
BİRİNCİL ANAHTARBirincil anahtar kısıtlaması , etkilenen sütun(lar) üzerinde bir UNIQUE kısıtlaması oluşturur ve standarttan farklı olarak , SQLite'ın PRIMARY KEY kısıtlaması NULL olan girişlere izin verir . Bu, standartla uyumsuzluktur ve bu sapma gelecekteki sürümlerde çözülebilir. Bu nedenle , birincil anahtar bildirimine NOT NULL kısıtlamasının eklenmesi önerilir .
ROWID ve OTOMATİK ARTIRMATablodaki her satır, ROWID adı verilen 64 bitlik işaretli bir tamsayı ile tanımlanır . Bir tablo bir ve tek olan beyan edildiğinde INTEGER PRIMARY KEY sütununda, bu sütunda bir takma ad haline rowID . ROWID tanımlayıcısıyla bir takma ad kullanmak , benzersizlik dizini ile ilişkili normal bir birincil anahtara göre iki kata kadar daha hızlı olabilen arama hızını artırır.
Tablo boş olduğunda, algoritma, 64 bitlik işaretli bir tamsayının ( ) sınırına ulaşana kadar her yeni kayıt için artırdığı tanımlayıcıya 1 değerini atar . Bu sınıra ulaşıldığında, silinen kayıtlar tarafından boşaltılan alanları yeniden kullanır. Bu nedenle tanımlayıcıların tahsisi artık artımlı değil rastgeledir.
AUTOINCREMENT anahtar sözcüğünü kullanmak mümkündür . İkincisi, algoritmayı biraz değiştirir: bir tamsayı sınırına ulaşıldığında, artık yeni bir kayıt eklemek mümkün olmayacaktır. Bu, aynı anda bir arada bulunmasalar bile, aynı tanımlayıcının asla iki farklı kayıt tarafından taşınmayacağını garanti etmeyi mümkün kılar.
YABANCI ANAHTAR3.6.19 sürümünden bu yana , SQLite yabancı anahtar kısıtlamalarını yönetebilir .
Geriye dönük uyumluluk nedenleriyle, yabancı anahtar desteği varsayılan olarak etkin değildir. Aktivasyon, Foreign_keys pragma tarafından yapılır .
Yabancı anahtar tarafından başvurulan herhangi bir sütun BENZERSİZ olarak bildirilmelidir ( PRIMARY KEY benzersiz bir anahtar oluşturur). SQLite, yabancı anahtarların tanımındaki MATCH yan tümcesini henüz dikkate almamaktadır .
SQLite, tetikleyicileri oldukça eksiksiz bir şekilde yönetir. ÖNCE , SONRA veya YERİNDEKİ tetikleyiciler raporlanabilir. SQLite FOR EACH ROW seçeneğini (varsayılan işlem) destekler, ancak FOR EACH STATEMENT için desteklemez .
SQLite , sorguların uzunluğunu azaltmak için görünümlerin oluşturulmasına izin verir .
Görünümler salt okunurdur, ancak bunları değiştirme yeteneğini simüle etmek için INSTEAD OF özelliğiyle tetikleyicileri kullanmak mümkündür .
Veritabanına (daha hoş çok başka bir komut durumunu değiştirmeye yönelik tüm SQL komutlarının SELECT'te ) bir oluşturulmasını içeren işlem zaten oluşturulmadı komutunu içeren bir işlem olduğu sürece, onlara adanmış. Bu, tüm komutların atomik olduğu anlamına gelir . Komutun yürütülmesi bir hataya neden olmazsa, değişiklik otomatik olarak yapılır ( autocommit ), ancak durum böyle değilse, komut tarafından yapılan tüm değişiklikler iptal edilir.
Veritabanındaki tüm değişiklikler serileştirilir: bir seferde yalnızca bir değişiklik gerçekleştirilir ve bir değişiklik sırasında veritabanı okuma için kilitlenir .
SQLite, işlemlerin yaratılmasının yanı sıra geri dönüş noktalarının ( SAVEPOINT ) oluşturulmasına da izin verir, ancak farklı izolasyon derecelerinin yönetilmesine izin vermez. Bir işlemde, bir okuma komutuna yapılan ilk çağrı sırasında, okuma erişimine izin veren ancak verilerin başka bir işlem tarafından değiştirilmesini yasaklayan paylaşılan bir kilit etkinleştirilir, ilk yazma çağrısı sırasında tüm veritabanı okunur ve diğer işlemler için yazma kilitlenir. .
ASİTSQLite ilk bakışta bir işlem sisteminin güvenilirliğini belirleyen ACID özellikleri kümesine uysa bile , türler zorunlu olmadığı için veritabanını tutarsız bir duruma getirmek hala mümkündür: örneğin, eklemek mümkündür. bir karakter dizisi afinite türü bir olarak tanımlanan bir sütunda tamsayı . Katı yorumlarında SQLite, ACID özellikleri kümesine uymaz.
SQLite , tanımı, verileri ve dizinleri veritabanı dosyasına kaydedilmeyen ve bu nedenle veritabanı kapatıldığında kaybolan geçici tabloların oluşturulmasına izin verir .
Bir veritabanı tablosunu simüle etmek için doğrudan kütüphaneden kendi depolama motorunu oluşturmak mümkündür. Sanal bir tablonun oluşturulması, bir dizi fonksiyon uygulanarak yapılır. Tabloya erişim, belirli işlevlerin olmaması dışında tamamen şeffaftır (tetikleyiciler veya dizinler oluşturmak veya tablonun yapısını değiştirmek imkansızdır).
Bu mekanizma, SQL dilini kullanarak CSV veya XML dosyaları gibi her türlü veri kaynağına erişim sağlar .
SQLite, kullanıcı işlevleri oluşturmak için kütüphanesi aracılığıyla bir programlama arabirimi sunar . Kitaplık tarafından tanımlanan işlevler kümesi, uygulamalarını yeniden tanımlamak için aşırı yüklenebilir . LIKE gibi bazı operatörler, kullanıcı tanımlı işlevlerle değiştirilebilen alt katman olarak adsız işlevleri kullanır.
SQLite, prosedürlerin oluşturulmasını desteklemez , ancak gömülü mimari nedeniyle ihtiyaçları daha azdır.
SQLite , bir veya daha fazla sütunda dizinlerin oluşturulmasına izin verir . Dizinler artan ( ASC ) veya azalan ( DESC ) olabileceği gibi benzersiz de olabilir (bu, benzersizlik kısıtlaması oluşturmaya benzer). SQLite, B-ağacı dizinini kullanır .
SQLite, bir komutu yürütmek için gereken adımları ve kullanılan dizinleri açıklamak için kullanılan EXPLAIN anahtar sözcüğünü sunar .
Pragmalar, SQLite yapılandırma anahtarı/değer çiftleridir. Bir veritabanının içindedirler ve SQLite'ın belirli işlemleri nasıl yorumlaması gerektiğini açıklamanıza izin verir. Ayrıca, özellikle geriye dönük uyumluluk nedenleriyle belirli özellikleri etkinleştirmenize veya devre dışı bırakmanıza da izin verirler.
Onun resmi uygulanması yanında C , bağlamaları diğeri için dillere (mevcut C ++ , Perl , Ruby , TCL kullanarak, dilleri .NET framework bir aracılığı ADO.NET sürücüsü ...).
Bazı programlama dilleri standart kitaplıklarında SQLite içerir , örneğin Python (sürüm 2.5'ten beri) ve PHP (sürüm 5'ten beri).
SQLite, Mozilla Firefox gibi birçok özgür yazılımda, birçok GNU/Linux dağıtımında , Solaris gibi sunucu ve masaüstü işletim sistemlerinde veya Android veya Symbian gibi mobil cihazlarda , Apple , Google , Adobe ve McAfee'nin bazı yazılımlarında ve bazılarında kullanılmaktadır. cihazlar Philips .
SQLite, Oracle'ın Primavera P6 yazılımının 8.4 sürümüyle de mevcuttur.
W3C tarafından yayınlanan web tarayıcı tarafında bir SQL veritabanının depolanmasına ilişkin taslakta da bu özelliği uygulayan yazılımın 3.6.19 sürümünde SQLite lehçesini doğru yorumlayabilmesi gerektiği belirtilmektedir . SQLite, W3C tarafından zorunlu tutulmasa da, Google Chrome , Apple Safari ve Opera Tarayıcı bu amaçla kullanır.
SQLite 2 ana versiyonda mevcuttur: 2.x ve 3.x. SQLite sürüm 2 ve 3, çeşitli gelişmelerle ayırt edilir: