SQLite Veri Türleri: Depolama Sınıflarına Yakından Bakış
SQLite’ın dinamik tür sistemiyle nasıl çalışacağınızı ve veri bütünlüğünü artırmak için tür yakınlığı, depolama sınıfları ve STRICT modu gibi özellikleri nasıl kullanacağınızı öğrenin.
SQLite, depolama sınıfları ve tür yakınlığına dayalı esnek bir tür sistemi kullanır. Sıkı tür dayatması yapan geleneksel RDBMS’lerin aksine, SQLite daha dinamik bir tür işleme yaklaşımına izin verir. Bu modeli anlamak, veri tutarlılığını sağlamak ve uygulama mantığında ince hatalardan kaçınmak için önemlidir.
Bu yazıda, SQLite’ın tür sistemini inceleyecek ve SQLite’ta yaygın veri türleriyle nasıl çalışacağınızı göstereceğim. SQL’e yeniyseniz, sağlam bir temel oluşturmak için Introduction to SQL kursumuzla başlamayı düşünebilirsiniz. Ayrıca, indirilebilir SQL Basics Cheat Sheet dökümü en yaygın SQL işlevlerini içerdiği için yararlı bir başvuru kaynağıdır.
SQLite’ın Tür Sisteminin Temel Kavramları
SQLite ile çalışmak için, verileri dahili olarak nasıl depoladığını ve yorumladığını kavramak önemlidir. Aşağıda, SQLite tür sisteminin güvenilir ve verimli uygulamaları nasıl tasarladığını açıklayacağım.
Depolama sınıflarının açıklaması
SQLite değerleri dahili olarak temsil etmek için beş depolama sınıfı kullanır:
NULL, eksik veya tanımsız bir değeri temsil eder.
INTEGER, büyüklüğe bağlı olarak 1 ila 8 baytta saklanan işaretli bir tamsayıyı temsil eder.
REAL, 8 baytlık bir IEEE-754 değeri olarak saklanan kayan noktalı bir sayıyı ifade eder.
TEXT, UTF-8, UTF-16BE veya UTF-16LE ile kodlanmış metin dizelerini saklar.
BLOB, ikili verileri girdideki haliyle, herhangi bir dönüşüm olmadan saklar.
Bu depolama sınıfları, bir tablo şemasındaki beyan edilen veri türlerinden farklıdır. Bir sütun VARCHAR(50) veya BOOLEAN olarak beyan edilebilir, ancak gerçek değer içeriğine bağlı olarak beş depolama sınıfından biriyle saklanır. Bu ayrım, SQLite’a dinamik ve hoşgörülü bir doğa kazandırır, ancak geliştiricilerin uygulama kodlarında veri doğrulaması ve tür tutarlılığına dikkat etmelerini de gerektirir.
Tür yakınlığı ve sütun davranışı
SQLite’ta tür yakınlığı, beyan edilen veri türüne göre bir sütuna atanan önerilen türdür. SQLite, beyan edilen tür metninden yakınlığı belirlemek için aşağıdaki kuralları kullanır.
VARCHAR, CHAR veya TEXT olarak beyan edilen sütunlar TEXT yakınlığı alır.
INT ve INTEGER gibi türler INTEGER yakınlığı alır.
DECIMAL, NUMERIC veya BOOLEAN gibi bildirimler NUMERIC yakınlığı alır.
REAL, FLOAT veya DOUBLE gibi türler REAL yakınlığı alır.
Tanınan bir tür beyan edilmemişse yakınlık varsayılan olarak BLOB olur.
Örneğin VARCHAR(100) olarak beyan edilen bir sütun TEXT yakınlığına sahip olacaktır; bu da SQLite’ın değerleri saklanırken metne dönüştürmeye çalışacağı anlamına gelir. Bu yakınlık, SQLite’ın verileri nasıl zorlayıp depoladığını yönlendirir, ancak o sütunda diğer türlerin saklanmasını kısıtlamaz.
Açık tip (manifest typing) ve sonuçları
SQLite, verinin türünün sütun kabıyla değil, tek tek değerle ilişkilendirildiği açık tip (manifest typing) kullanır. Bu, tek bir sütunda birden fazla türde değerin bir arada bulunmasına olanak tanır. Örneğin, INTEGER olarak beyan edilen bir sütun TEXT veya BLOB değerleri tutabilir.
Açık tip, geliştiricilerin şemayı değiştirmeden çeşitli veri türlerini eklemesine olanak tanır. Ancak bunun bedeli, tutarsız verilere, öngörülemeyen sıralamaya ve tür kurallarını dayatmak için uygulama mantığına daha fazla bağımlılığa yol açabilmesidir.
Veritabanı yönetimini, farklı veri türlerinde verileri düzenlemeyi ve veritabanlarını yönetmeyi öğrenmek için Database Design kursumuzu almanızı öneririm.
SQLite’ta Yaygın Veri Türleriyle Çalışma
Şimdi SQLite’ta metin, sayılar, boolean’lar, tarihler ve ikili veriler gibi yaygın veri türlerinin nasıl ele alınacağına bakalım.
Metin, sayılar ve boolean’lar
SQLite’ta yaygın kullanılan veri bildirimleri TEXT, INTEGER, REAL, NUMERIC ve BOOLEAN olsa da değerler sıkı türlere göre değil, tür yakınlığına göre saklanır. Aşağıda gerçek dünyadaki bir şemada her veri türü için kullanım örnekleri yer alır.
TEXT, adlar, e-postalar, URL’ler ve genel metinsel veriler için uygun olan dizeleri saklar.
INTEGER, sayımlar, kimlikler ve kodlar gibi tam sayılar için idealdir; verimli depolama ve sıralama sağlar.
REAL, ölçümler, para birimi veya tamsayı olmayan değerler için kayan noktalı sayıları saklar.
NUMERIC yakınlığı, DECIMAL, BOOLEAN veya benzeri olarak beyan edilen değerleri kapsar. Değere bağlı olarak SQLite bunları INTEGER veya REAL olarak saklamaya çalışır.
BOOLEAN yerel bir depolama sınıfı değildir; perde arkasında INTEGER olarak 0 (FALSE) veya 1 (TRUE) değerleri saklanarak taklit edilir.
Boolean’lar için, uygulama tarafında açık kısıtlamalarla INTEGER kullanmanızı öneririm; esnek sayı ayrıştırması gerektiren değerler için NUMERIC uygundur.
Tarihler, saatler ve zamansal stratejiler
SQLite’ta yerel bir DATE veya DATETIME türü yoktur; ancak zamansal verileri depolamak için aşağıdaki biçimleri destekler:
TEXT: Tarih/saatleri YYYY-MM-DD HH:MM:SS gibi ISO8601 dizeleri olarak saklar. Bu biçim insan tarafından okunabilir ve birçok araçla uyumludur, ancak karşılaştırmalar için daha yavaş olabilir.
REAL: Tarihleri Jülyen gün numarası (kayan nokta) olarak saklar; tarih aritmetiği ve aralık sorguları için kullanışlıdır, ancak daha az okunabilirdir.
INTEGER: 1970-01-01’den bu yana geçen saniyeleri ifade eden Unix zaman damgalarını saklar. Depolama açısından verimlidir ve sayısal karşılaştırmalar hızlıdır, ancak insan tarafından okunabilir değildir.
Zamansal verilerle çalışırken, ayrıştırma, biçimlendirme ve zamansal biçimler arasında dönüştürme için date(), time(), datetime(), julianday() ve strftime() işlevlerini kullanabilirsiniz.
İkili ve sayısal uç durumlar
SQLite, BLOB depolama sınıfı aracılığıyla ikili verileri de destekler. BLOB’lar görselleri, dosyaları veya metinsel olmayan herhangi bir veriyi saklamak için kullanışlıdır. BLOB veri türleriyle çalışırken daima parametreleştirilmiş sorgular veya bağlamalar kullanarak BLOB ekleyin. Büyük ikilileri harici olarak saklayıp bunlara yol veya hash ile referans verebilirsiniz.
SQLite, 8 bayta kadar tamsayıları (-2^63 ila 2^63-1) saklayabilirken, bu aralığın ötesindeki değerler sessizce REAL veri türüne dönüştürülebilir. Bu da değerlerin hassasiyet kaybetmesine yol açabilir. SQLite, ondalık hassasiyet için sıkı bir dayatma sunmaz; bu nedenle finansal verilerde hassasiyet gerektiğinde her zaman harici kütüphaneler veya uygulama mantığını kullanın.
STRICT Tablolarla Yapıyı Zorunlu Kılma
Geleneksel esnek tür sisteminden farklı olarak SQLite, 3.37.0 sürümünde STRICT tablolarını tanıttı. STRICT tablo, sütun değerleri için tam tür eşleşmesini zorunlu kılan daha sıkı bir türleme modu sağlar. Bir tabloyu STRICT olarak beyan ettiğinizde, eklenen her değer sütunun beyan edilen türüyle eşleşmelidir; herhangi bir uyuşmazlık hata ile sonuçlanır.
STRICT modu, veri tutarlılığını ve doğrulamayı iyileştirir. Ayrıca türle ilgili hataları geliştirme aşamasında erken yakalamaya yardımcı olur ve SQLite’ın davranışını daha öngörülebilir hale getirir; geleneksel RDBMS’lere daha yakınlaştırır.
Geliştirici olarak STRICT kullanmadan önce, bunun yalnızca SQLite 3.37.0 ve üzeri sürümlerde mevcut olduğunu not etmelisiniz. Ayrıca aynı tabloda STRICT ve açık tipi birlikte kullanamazsınız.
Performans ve Tasarım Hususları
SQLite, performansla ilgili sonuçları olan esnek bir tür sistemine sahiptir. INTEGER ve REAL değerleri için değişken uzunluklu kodlama kullanır; yani daha küçük sayılar daha az bayt kullanır. Bu, özellikle büyük veri kümelerinde veritabanı boyutunu en aza indirmeye yardımcı olur.
Tür yakınlığı, değerlerin nasıl saklandığını ve karşılaştırıldığını da etkiler. Bir sütundaki tutarsız türler, SQLite aramalar sırasında ek tür dönüşümleri yapabileceğinden indekslerin etkinliğini azaltabilir ve sorguları yavaşlatabilir.
Verimli şemalar ve sorgular tasarlamak için aşağıdaki stratejileri göz önünde bulundurun.
Tür zorlaması yükünü en aza indirmek için net ve tutarlı yakınlıklara sahip sütunlar tanımlayın.
Tutarlı davranışı sağlamak için tür dönüşümü gerektiğinde sorgularda açıkça döküm (cast) yapmayı düşünün.
Sayısal kimlikler ve sayaçlar için INTEGER yakınlığını, kayan noktalı veriler için REAL’i ve dizeler için TEXT’i kullanın.
Sıralama ve karşılaştırma tuhaflıklarını önlemek için aynı sütunda veri türlerini karıştırmaktan kaçının.
Gereksiz tür zorlamasını veya veri çoğaltmasını önlemek için şemaları normalize edin.
Performansı analiz etmek ve sorguları iyileştirmek için EXPLAIN QUERY PLAN kullanın.
Şema Kalıplarıyla SQLite Veri Türü Örnekleri
Aşağıdaki tablo şemaları, SQLite’ın veri türlerinin, tür yakınlığının ve kısıtlamalarının bilinçli kullanımını göstermektedir.
Boolean taklidi ve kısıtlamalarla kullanıcılar tablosu
Aşağıdaki örnekte:
is_active, CHECK kısıtlamasıyla INTEGER kullanarak bir boolean’ı taklit eder.
TEXT veri türü, dize değerler için tutarlılık sağlarken INTEGER boolean benzeri mantık içindir.
-- Create users table with auto-incrementing rowid and enforce uniquenessCREATETABLE users (
id INTEGERPRIMARYKEY,
username TEXTNOTNULLUNIQUE,
email TEXTNOTNULL,
is_active INTEGERNOTNULLDEFAULT1CHECK(is_active IN(0,1))-- Simulates boolean);Altyapı:
Zamansal veriler ve sayısal hassasiyet kullanan siparişler tablosu
Aşağıdaki sorguda, total uygulama düzeyinde hassasiyeti ele almak için para birimi benzeri değerlerde NUMERIC kullanır. order_date okunabilirliği ve tarih işlevleriyle uyumluluğu sağlamak için ISO-8601 biçiminde TEXT olarak saklanır.
-- Create orders table with row identifier and foreign key in practice-- ISO date format "YYYY-MM-DD"CREATETABLE orders (
order_id INTEGERPRIMARYKEY,
customer_id INTEGERNOTNULL,
total NUMERICNOTNULL,
order_date TEXTNOTNULLCHECK(length(order_date)=10));Altyapı:
İkili ve tür kontrolleriyle dosyalar tablosu
Aşağıdaki sorguda, content ham ikili verileri saklamak için BLOB kullanır. uploaded_at, alan ve performans verimliliği için zamanı INTEGER olarak saklar.
-- Create files table with raw binary data and Unix timestamp (epoch seconds)CREATETABLE files (
file_id INTEGERPRIMARYKEY,
name TEXTNOTNULL,
content BLOBNOTNULL,
uploaded_at INTEGERNOTNULL);Altyapı:
Türü çalışma zamanında aşağıdaki sorguyla doğrulayabilirsiniz:
SQLite’ın Diğer Veritabanlarıyla Karşılaştırılması
SQLite’ın tür sistemi, MySQL veya PostgreSQL gibi geleneksel RDBMS’lerden daha esnektir. Aşağıdaki tablo, SQLite’ı bu veritabanlarıyla karşılaştırır.
Özellik
SQLite
MySQL
PostgreSQL
Türleme Modeli
Dinamik (açık tip, tür yakınlığı)
Sıkı (sessiz zorlama gibi bazı tuhaflıklarla)
Sıkı (güçlü türleme uygulanır)
Beyan Edilen Türün Uygulanması
Uygulanmaz (STRICT modu kullanılmadıkça)
Çoğunlukla uygulanır, ancak bir miktar esneklik tanır
Tamamen uygulanır
Boolean İşleme
0/1, TEXT, NUMERIC gibi taklit edilir.
BOOLEAN türü vardır (TRUE, FALSE)
Yerel BOOLEAN türü
Tarih/Saat Türleri
TEXT, REAL veya INTEGER olarak elle saklanır
Yerel tarih/saat türleri
Yerel ve kapsamlı zamansal türler
Dizin Hassasiyeti
Bir sütunda karışık türlere duyarlıdır
Türleme sayesinde güvenilir
Türleme sayesinde güvenilir
Şema Esnekliği
Çok yüksek (varsayılan olarak az kısıtlama)
Orta
Yapılandırılmış ve sağlam
SQLite’a Geçiş
Sıkı tür dayatmasının gevşetilmesi gerekebilir
Genellikle küçük ayarlamalarla sorunsuz
Basitleştirme veya hassasiyet kaybı gerekebilir
SQLite’tan Geçiş
Veri temizliği ve tür normalizasyonu gerektirir
Daha sıkı türlemeye veri uyumu gerekir
Veri uyumu ve daha sıkı şema gerekir
Sonuç
SQLite, bilinçli kullanıldığında farklı avantajlar sunan esnek bir tür sistemine sahiptir. Depolama sınıflarını, tür yakınlığını ve açık tipi anlamak, geliştiricilerin uyarlanabilirlik ile güvenilirliği dengeleyen şemalar tasarlamasını sağlar. STRICT tablolar, tutarlı tür kullanımı ve normalleştirme gibi özellikler gerektiğinde yapıyı zorunlu kılmaya yardımcı olur.
Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.
SSS
SQLite’ın depolama sınıfları nelerdir?⌄
SQLite depolama sınıfları şunları içerir: NULL, INTEGER, REAL, TEXT ve BLOB.
Bir sütun birden fazla veri türünü depolayabilir mi?⌄
Evet, tablo STRICT olarak beyan edilmemişse, herhangi bir sütun farklı türlerde değerler tutabilir.
SQLite’ta tür yakınlığı nedir?⌄
Tür yakınlığı, beyan edilen türüne göre bir sütun için önerilen türdür. SQLite, eklenen değerleri sütunun yakınlık türüne dönüştürmeye çalışır ancak bunu sıkı biçimde dayatmaz.
BOOLEAN değerleri SQLite’ta nasıl ele alınır?⌄
SQLite’ta ayrı bir BOOLEAN türü yoktur. Boolean değerler genellikle INTEGER olarak, 0 (FALSE) veya 1 (TRUE) biçiminde, NUMERIC yakınlığı kullanılarak saklanır.
Bir değerin nasıl saklandığını nasıl kontrol edebilirim?⌄
Bir değerin gerçek depolama sınıfını incelemek için typeof() işlevini kullanın.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
SQLite, depolama sınıfları ve tür yakınlığına dayalı esnek bir tür sistemi kullanır. Sıkı tür dayatması yapan geleneksel RDBMS’lerin aksine, SQLite daha dinamik bir tür işleme yaklaşımına izin verir. Bu modeli anlamak, veri tutarlılığını sağlamak ve uygulama mantığında ince hatalardan kaçınmak için önemlidir.
Bu yazıda, SQLite’ın tür sistemini inceleyecek ve SQLite’ta yaygın veri türleriyle nasıl çalışacağınızı göstereceğim. SQL’e yeniyseniz, sağlam bir temel oluşturmak için Introduction to SQL kursumuzla başlamayı düşünebilirsiniz. Ayrıca, indirilebilir SQL Basics Cheat Sheet dökümü en yaygın SQL işlevlerini içerdiği için yararlı bir başvuru kaynağıdır.
SQLite’ın Tür Sisteminin Temel Kavramları
SQLite ile çalışmak için, verileri dahili olarak nasıl depoladığını ve yorumladığını kavramak önemlidir. Aşağıda, SQLite tür sisteminin güvenilir ve verimli uygulamaları nasıl tasarladığını açıklayacağım.
Depolama sınıflarının açıklaması
SQLite değerleri dahili olarak temsil etmek için beş depolama sınıfı kullanır:
NULL, eksik veya tanımsız bir değeri temsil eder.INTEGER, büyüklüğe bağlı olarak 1 ila 8 baytta saklanan işaretli bir tamsayıyı temsil eder.REAL, 8 baytlık bir IEEE-754 değeri olarak saklanan kayan noktalı bir sayıyı ifade eder.TEXT, UTF-8, UTF-16BE veya UTF-16LE ile kodlanmış metin dizelerini saklar.BLOB, ikili verileri girdideki haliyle, herhangi bir dönüşüm olmadan saklar.SQLite Veri Türleri. Görsel Kaynağı: OpenAI
Bu depolama sınıfları, bir tablo şemasındaki beyan edilen veri türlerinden farklıdır. Bir sütun
VARCHAR(50)veyaBOOLEANolarak beyan edilebilir, ancak gerçek değer içeriğine bağlı olarak beş depolama sınıfından biriyle saklanır. Bu ayrım, SQLite’a dinamik ve hoşgörülü bir doğa kazandırır, ancak geliştiricilerin uygulama kodlarında veri doğrulaması ve tür tutarlılığına dikkat etmelerini de gerektirir.Tür yakınlığı ve sütun davranışı
SQLite’ta tür yakınlığı, beyan edilen veri türüne göre bir sütuna atanan önerilen türdür. SQLite, beyan edilen tür metninden yakınlığı belirlemek için aşağıdaki kuralları kullanır.
VARCHAR,CHARveyaTEXTolarak beyan edilen sütunlarTEXTyakınlığı alır.INTveINTEGERgibi türlerINTEGERyakınlığı alır.DECIMAL,NUMERICveyaBOOLEANgibi bildirimlerNUMERICyakınlığı alır.REAL,FLOATveyaDOUBLEgibi türlerREALyakınlığı alır.Tanınan bir tür beyan edilmemişse yakınlık varsayılan olarak
BLOBolur.Örneğin
VARCHAR(100)olarak beyan edilen bir sütunTEXTyakınlığına sahip olacaktır; bu da SQLite’ın değerleri saklanırken metne dönüştürmeye çalışacağı anlamına gelir. Bu yakınlık, SQLite’ın verileri nasıl zorlayıp depoladığını yönlendirir, ancak o sütunda diğer türlerin saklanmasını kısıtlamaz.Açık tip (manifest typing) ve sonuçları
SQLite, verinin türünün sütun kabıyla değil, tek tek değerle ilişkilendirildiği açık tip (manifest typing) kullanır. Bu, tek bir sütunda birden fazla türde değerin bir arada bulunmasına olanak tanır. Örneğin,
INTEGERolarak beyan edilen bir sütunTEXTveyaBLOBdeğerleri tutabilir.Açık tip, geliştiricilerin şemayı değiştirmeden çeşitli veri türlerini eklemesine olanak tanır. Ancak bunun bedeli, tutarsız verilere, öngörülemeyen sıralamaya ve tür kurallarını dayatmak için uygulama mantığına daha fazla bağımlılığa yol açabilmesidir.
Veritabanı yönetimini, farklı veri türlerinde verileri düzenlemeyi ve veritabanlarını yönetmeyi öğrenmek için Database Design kursumuzu almanızı öneririm.
SQLite’ta Yaygın Veri Türleriyle Çalışma
Şimdi SQLite’ta metin, sayılar, boolean’lar, tarihler ve ikili veriler gibi yaygın veri türlerinin nasıl ele alınacağına bakalım.
Metin, sayılar ve boolean’lar
SQLite’ta yaygın kullanılan veri bildirimleri
TEXT,INTEGER,REAL,NUMERICveBOOLEANolsa da değerler sıkı türlere göre değil, tür yakınlığına göre saklanır. Aşağıda gerçek dünyadaki bir şemada her veri türü için kullanım örnekleri yer alır.TEXT, adlar, e-postalar, URL’ler ve genel metinsel veriler için uygun olan dizeleri saklar.INTEGER, sayımlar, kimlikler ve kodlar gibi tam sayılar için idealdir; verimli depolama ve sıralama sağlar.REAL, ölçümler, para birimi veya tamsayı olmayan değerler için kayan noktalı sayıları saklar.NUMERICyakınlığı,DECIMAL,BOOLEANveya benzeri olarak beyan edilen değerleri kapsar. Değere bağlı olarak SQLite bunlarıINTEGERveyaREALolarak saklamaya çalışır.BOOLEANyerel bir depolama sınıfı değildir; perde arkasındaINTEGERolarak0(FALSE) veya1(TRUE) değerleri saklanarak taklit edilir.Boolean’lar için, uygulama tarafında açık kısıtlamalarla
INTEGERkullanmanızı öneririm; esnek sayı ayrıştırması gerektiren değerler içinNUMERICuygundur.Tarihler, saatler ve zamansal stratejiler
SQLite’ta yerel bir
DATEveyaDATETIMEtürü yoktur; ancak zamansal verileri depolamak için aşağıdaki biçimleri destekler:TEXT: Tarih/saatleriYYYY-MM-DD HH:MM:SSgibi ISO8601 dizeleri olarak saklar. Bu biçim insan tarafından okunabilir ve birçok araçla uyumludur, ancak karşılaştırmalar için daha yavaş olabilir.REAL: Tarihleri Jülyen gün numarası (kayan nokta) olarak saklar; tarih aritmetiği ve aralık sorguları için kullanışlıdır, ancak daha az okunabilirdir.INTEGER: 1970-01-01’den bu yana geçen saniyeleri ifade eden Unix zaman damgalarını saklar. Depolama açısından verimlidir ve sayısal karşılaştırmalar hızlıdır, ancak insan tarafından okunabilir değildir.Zamansal verilerle çalışırken, ayrıştırma, biçimlendirme ve zamansal biçimler arasında dönüştürme için
date(),time(),datetime(),julianday()vestrftime()işlevlerini kullanabilirsiniz.İkili ve sayısal uç durumlar
SQLite,
BLOBdepolama sınıfı aracılığıyla ikili verileri de destekler. BLOB’lar görselleri, dosyaları veya metinsel olmayan herhangi bir veriyi saklamak için kullanışlıdır.BLOBveri türleriyle çalışırken daima parametreleştirilmiş sorgular veya bağlamalar kullanarak BLOB ekleyin. Büyük ikilileri harici olarak saklayıp bunlara yol veya hash ile referans verebilirsiniz.SQLite, 8 bayta kadar tamsayıları (
-2^63ila2^63-1) saklayabilirken, bu aralığın ötesindeki değerler sessizceREALveri türüne dönüştürülebilir. Bu da değerlerin hassasiyet kaybetmesine yol açabilir. SQLite, ondalık hassasiyet için sıkı bir dayatma sunmaz; bu nedenle finansal verilerde hassasiyet gerektiğinde her zaman harici kütüphaneler veya uygulama mantığını kullanın.STRICT Tablolarla Yapıyı Zorunlu Kılma
Geleneksel esnek tür sisteminden farklı olarak SQLite, 3.37.0 sürümünde
STRICTtablolarını tanıttı.STRICTtablo, sütun değerleri için tam tür eşleşmesini zorunlu kılan daha sıkı bir türleme modu sağlar. Bir tabloyuSTRICTolarak beyan ettiğinizde, eklenen her değer sütunun beyan edilen türüyle eşleşmelidir; herhangi bir uyuşmazlık hata ile sonuçlanır.STRICTmodu, veri tutarlılığını ve doğrulamayı iyileştirir. Ayrıca türle ilgili hataları geliştirme aşamasında erken yakalamaya yardımcı olur ve SQLite’ın davranışını daha öngörülebilir hale getirir; geleneksel RDBMS’lere daha yakınlaştırır.Geliştirici olarak
STRICTkullanmadan önce, bunun yalnızca SQLite 3.37.0 ve üzeri sürümlerde mevcut olduğunu not etmelisiniz. Ayrıca aynı tablodaSTRICTve açık tipi birlikte kullanamazsınız.Performans ve Tasarım Hususları
SQLite, performansla ilgili sonuçları olan esnek bir tür sistemine sahiptir.
INTEGERveREALdeğerleri için değişken uzunluklu kodlama kullanır; yani daha küçük sayılar daha az bayt kullanır. Bu, özellikle büyük veri kümelerinde veritabanı boyutunu en aza indirmeye yardımcı olur.Tür yakınlığı, değerlerin nasıl saklandığını ve karşılaştırıldığını da etkiler. Bir sütundaki tutarsız türler, SQLite aramalar sırasında ek tür dönüşümleri yapabileceğinden indekslerin etkinliğini azaltabilir ve sorguları yavaşlatabilir.
Verimli şemalar ve sorgular tasarlamak için aşağıdaki stratejileri göz önünde bulundurun.
Tür zorlaması yükünü en aza indirmek için net ve tutarlı yakınlıklara sahip sütunlar tanımlayın.
Tutarlı davranışı sağlamak için tür dönüşümü gerektiğinde sorgularda açıkça döküm (cast) yapmayı düşünün.
Sayısal kimlikler ve sayaçlar için
INTEGERyakınlığını, kayan noktalı veriler içinREAL’i ve dizeler içinTEXT’i kullanın.Sıralama ve karşılaştırma tuhaflıklarını önlemek için aynı sütunda veri türlerini karıştırmaktan kaçının.
Gereksiz tür zorlamasını veya veri çoğaltmasını önlemek için şemaları normalize edin.
Performansı analiz etmek ve sorguları iyileştirmek için
EXPLAIN QUERY PLANkullanın.Şema Kalıplarıyla SQLite Veri Türü Örnekleri
Aşağıdaki tablo şemaları, SQLite’ın veri türlerinin, tür yakınlığının ve kısıtlamalarının bilinçli kullanımını göstermektedir.
Boolean taklidi ve kısıtlamalarla kullanıcılar tablosu
Aşağıdaki örnekte:
is_active,CHECKkısıtlamasıylaINTEGERkullanarak bir boolean’ı taklit eder.TEXTveri türü, dize değerler için tutarlılık sağlarkenINTEGERboolean benzeri mantık içindir.Zamansal veriler ve sayısal hassasiyet kullanan siparişler tablosu
Aşağıdaki sorguda,
totaluygulama düzeyinde hassasiyeti ele almak için para birimi benzeri değerlerdeNUMERICkullanır.order_dateokunabilirliği ve tarih işlevleriyle uyumluluğu sağlamak için ISO-8601 biçimindeTEXTolarak saklanır.İkili ve tür kontrolleriyle dosyalar tablosu
Aşağıdaki sorguda,
contentham ikili verileri saklamak içinBLOBkullanır.uploaded_at, alan ve performans verimliliği için zamanıINTEGERolarak saklar.Türü çalışma zamanında aşağıdaki sorguyla doğrulayabilirsiniz:
Veri yapıları ve veritabanlarında tablo oluşturma hakkında daha fazla bilgi edinmek için Introduction to Relational Databases in SQL kursumuzu almanızı öneririm.
SQLite’ın Diğer Veritabanlarıyla Karşılaştırılması
SQLite’ın tür sistemi, MySQL veya PostgreSQL gibi geleneksel RDBMS’lerden daha esnektir. Aşağıdaki tablo, SQLite’ı bu veritabanlarıyla karşılaştırır.
Özellik
SQLite
MySQL
PostgreSQL
Türleme Modeli
Dinamik (açık tip, tür yakınlığı)
Sıkı (sessiz zorlama gibi bazı tuhaflıklarla)
Sıkı (güçlü türleme uygulanır)
Beyan Edilen Türün Uygulanması
Uygulanmaz (
STRICTmodu kullanılmadıkça)Çoğunlukla uygulanır, ancak bir miktar esneklik tanır
Tamamen uygulanır
Boolean İşleme
0/1,TEXT,NUMERICgibi taklit edilir.BOOLEANtürü vardır (TRUE,FALSE)Yerel
BOOLEANtürüTarih/Saat Türleri
TEXT,REALveyaINTEGERolarak elle saklanırYerel tarih/saat türleri
Yerel ve kapsamlı zamansal türler
Dizin Hassasiyeti
Bir sütunda karışık türlere duyarlıdır
Türleme sayesinde güvenilir
Türleme sayesinde güvenilir
Şema Esnekliği
Çok yüksek (varsayılan olarak az kısıtlama)
Orta
Yapılandırılmış ve sağlam
SQLite’a Geçiş
Sıkı tür dayatmasının gevşetilmesi gerekebilir
Genellikle küçük ayarlamalarla sorunsuz
Basitleştirme veya hassasiyet kaybı gerekebilir
SQLite’tan Geçiş
Veri temizliği ve tür normalizasyonu gerektirir
Daha sıkı türlemeye veri uyumu gerekir
Veri uyumu ve daha sıkı şema gerekir
Sonuç
SQLite, bilinçli kullanıldığında farklı avantajlar sunan esnek bir tür sistemine sahiptir. Depolama sınıflarını, tür yakınlığını ve açık tipi anlamak, geliştiricilerin uyarlanabilirlik ile güvenilirliği dengeleyen şemalar tasarlamasını sağlar.
STRICTtablolar, tutarlı tür kullanımı ve normalleştirme gibi özellikler gerektiğinde yapıyı zorunlu kılmaya yardımcı olur.Bir sonraki adım olarak, farklı veri türlerindeki verileri gelişmiş SQL sorgularıyla nasıl analiz edeceğinizi öğrenmek için Exploratory Data Analysis in SQL ve Data Manipulation in SQL kurslarımızı almanızı öneririm.