Ana içeriğe geç

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.
· 8 dk. oku

Yapay Zeka ile Keşfedin

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 Data Types

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) 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 uniqueness
CREATE TABLE users (
    id INTEGER PRIMARY KEY, 
    username TEXT NOT NULL UNIQUE, 
    email TEXT NOT NULL, 
    is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0, 1))  -- Simulates boolean
);

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"
CREATE TABLE orders (
    order_id INTEGER PRIMARY KEY,  
    customer_id INTEGER NOT NULL, 
    total NUMERIC NOT NULL, 
    order_date TEXT NOT NULL CHECK (length(order_date) = 10)  );

İ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)
CREATE TABLE files (
    file_id INTEGER PRIMARY KEY, 
    name TEXT NOT NULL, 
    content BLOB NOT NULL,  
    uploaded_at INTEGER NOT NULL 
);

Türü çalışma zamanında aşağıdaki sorguyla doğrulayabilirsiniz:

SELECT typeof(uploaded_at), typeof(content) FROM files;

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 (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.

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.

Allan Ouko

Yazar

Allan Ouko

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.

Konular

İlgili