Lewati ke konten utama

Tipe Data SQLite: Menilik Lebih Dekat Kelas Penyimpanan

Pelajari cara bekerja dengan sistem tipe dinamis SQLite dan gunakan fitur seperti type affinity, storage classes, dan mode STRICT untuk integritas data yang lebih baik.
· 8 mnt Baca

Jelajahi bersama AI

SQLite menggunakan sistem tipe data yang fleksibel berdasarkan storage classes dan type affinity. Berbeda dengan RDBMS tradisional yang menerapkan pengetikan ketat, SQLite memungkinkan penanganan tipe yang lebih dinamis. Memahami model ini penting untuk memastikan konsistensi data dan menghindari bug halus dalam logika aplikasi.

Dalam artikel ini, saya akan membahas sistem tipe data SQLite dan menunjukkan cara bekerja dengan tipe data umum di SQLite. Jika Anda baru di SQL, pertimbangkan untuk memulai dengan kursus Introduction to SQL kami untuk membangun dasar yang kuat. Selain itu, saya menemukan SQL Basics Cheat Sheet yang dapat Anda unduh sebagai referensi yang membantu karena memuat semua fungsi SQL yang paling umum.

Konsep Inti dari Sistem Tipe SQLite

Untuk bekerja dengan SQLite, penting memahami bagaimana ia menyimpan dan menafsirkan data secara internal. Di bawah ini saya akan menjelaskan bagaimana sistem tipe SQLite membantu merancang aplikasi yang andal dan efisien.

Penjelasan storage classes

SQLite menggunakan lima storage classes untuk merepresentasikan nilai secara internal:

  • NULL merepresentasikan nilai yang hilang atau tidak terdefinisi.

  • INTEGER merepresentasikan bilangan bulat bertanda yang disimpan dalam 1 hingga 8 byte, tergantung besarnya nilai.

  • REAL menggambarkan bilangan floating-point yang disimpan sebagai nilai IEEE-754 8 byte.

  • TEXT menyimpan string teks yang dikodekan dalam UTF-8, UTF-16BE, atau UTF-16LE.

  • BLOB menyimpan data biner persis seperti inputnya, tanpa transformasi apa pun.

SQLite Data Types

Tipe Data SQLite. Sumber Gambar: OpenAI

Storage classes ini berbeda dari tipe data yang dideklarasikan dalam skema tabel. Kolom dapat dideklarasikan sebagai VARCHAR(50) atau BOOLEAN, tetapi nilai sebenarnya disimpan menggunakan salah satu dari lima storage classes berdasarkan isinya. Pemisahan ini memberi SQLite sifat yang dinamis dan toleran, namun juga mengharuskan pengembang untuk memperhatikan validasi data dan konsistensi tipe dalam kode aplikasi mereka.

Type affinity dan perilaku kolom

Type affinity di SQLite adalah tipe yang direkomendasikan untuk suatu kolom berdasarkan tipe data yang dideklarasikan. SQLite menggunakan aturan berikut untuk menentukan affinity dari teks tipe yang dideklarasikan.

  • Kolom yang dideklarasikan sebagai VARCHAR, CHAR, atau TEXT mendapatkan affinity TEXT.

  • Tipe seperti INT dan INTEGER mendapatkan affinity INTEGER.

  • Deklarasi seperti DECIMAL, NUMERIC, atau BOOLEAN mendapatkan affinity NUMERIC.

  • Tipe seperti REAL, FLOAT, atau DOUBLE mendapatkan affinity REAL.

  • Affinity akan menjadi BLOB secara default jika tidak ada tipe yang dikenali dideklarasikan.

Sebagai contoh, kolom yang dideklarasikan sebagai VARCHAR(100) akan memiliki affinity TEXT, artinya SQLite akan mencoba mengonversi nilai menjadi teks saat disimpan. Affinity ini memandu bagaimana SQLite memaksa dan menyimpan data, tetapi tidak membatasi penyimpanan tipe lain di kolom tersebut.

Manifest typing dan implikasinya

SQLite menggunakan manifest typing, artinya tipe data dikaitkan dengan nilai individual, bukan kontainer kolom. Ini memungkinkan banyak jenis nilai berdampingan dalam satu kolom. Misalnya, kolom yang dideklarasikan sebagai INTEGER dapat menampung nilai TEXT atau BLOB.

Manifest typing memungkinkan pengembang memasukkan beragam tipe data tanpa mengubah skema. Namun, komprominya adalah potensi data tidak konsisten, pengurutan yang tidak dapat diprediksi, dan ketergantungan lebih besar pada logika aplikasi untuk menegakkan aturan tipe.

Saya merekomendasikan mengambil kursus Database Design kami untuk mempelajari pengelolaan basis data termasuk mengatur data dalam berbagai tipe data dan mengelola database.

Bekerja dengan Tipe Data Umum di SQLite

Sekarang mari kita lihat cara menangani tipe data umum di SQLite, seperti teks, angka, boolean, tanggal, dan data biner.

Teks, angka, dan boolean

Deklarasi data yang umum digunakan di SQLite mencakup TEXT, INTEGER, REAL, NUMERIC, dan BOOLEAN, tetapi menyimpan nilai berdasarkan type affinity, bukan tipe yang ketat. Berikut adalah kasus penggunaan untuk setiap tipe data dalam skema dunia nyata.

  • TEXT menyimpan string, cocok untuk nama, email, URL, dan data tekstual umum.

  • INTEGER ideal untuk bilangan bulat seperti hitungan, ID, dan kode, menawarkan penyimpanan dan pengurutan yang efisien.

  • REAL menyimpan bilangan floating-point untuk pengukuran, mata uang, atau nilai non-integer.

  • Affinity NUMERIC mencakup nilai yang dideklarasikan sebagai DECIMAL, BOOLEAN, atau serupa. Bergantung pada nilainya, SQLite akan mencoba menyimpannya sebagai INTEGER atau REAL.

  • BOOLEAN bukan storage class native tetapi disimulasikan dengan menyimpan 0 (FALSE) atau 1 (TRUE) sebagai nilai INTEGER di balik layar.

Saya merekomendasikan menggunakan INTEGER untuk boolean dengan pembatasan eksplisit di sisi aplikasi, sementara NUMERIC tepat untuk nilai yang memerlukan parsing angka yang fleksibel.

Tanggal, waktu, dan strategi temporal

SQLite tidak memiliki tipe DATE atau DATETIME native, tetapi mendukung format berikut untuk menyimpan data temporal:

  • TEXT: Menyimpan tanggal/waktu sebagai string ISO8601 seperti YYYY-MM-DD HH:MM:SS. Format ini mudah dibaca manusia dan kompatibel dengan banyak alat, tetapi bisa lebih lambat untuk perbandingan.

  • REAL: Menyimpan tanggal sebagai angka hari Julian (floating-point), berguna untuk aritmetika tanggal dan kueri rentang, tetapi kurang mudah dibaca.

  • INTEGER: Menyimpan Unix timestamp, detik sejak 1970-01-01. Efisien untuk penyimpanan dan perbandingan numerik yang cepat, tetapi tidak mudah dibaca manusia.

Saat bekerja dengan data temporal, Anda dapat menggunakan fungsi-fungsi berikut: date(), time(), datetime(), julianday(), dan strftime() untuk parsing, pemformatan, dan konversi antarformat temporal.

Kasus tepi biner dan numerik

SQLite juga mendukung data biner melalui storage class BLOB. BLOB berguna untuk menyimpan gambar, file, atau data non-teks apa pun. Saat bekerja dengan tipe data BLOB, selalu gunakan kueri parameter atau binding untuk memasukkan BLOB. Anda juga dapat menyimpan biner berukuran besar secara eksternal dan mereferensikannya dengan path atau hash.

Meskipun SQLite dapat menyimpan integer hingga 8 byte (-2^63 hingga 2^63-1), nilai di luar rentang ini mungkin diam-diam dikonversi ke tipe data REAL. Hal ini dapat membuat nilai kehilangan presisi. SQLite tidak memiliki penegakan ketat untuk presisi desimal, jadi selalu gunakan pustaka eksternal atau logika aplikasi untuk data finansial saat Anda memerlukan presisi.

Menegakkan struktur dengan tabel STRICT

Berbeda dengan sistem pengetikan yang fleksibel secara tradisional, SQLite memperkenalkan tabel STRICT pada versi 3.37.0. Tabel STRICT menyediakan mode pengetikan yang lebih ketat yang menegakkan kecocokan tipe secara tepat untuk nilai kolom. Saat Anda mendeklarasikan tabel sebagai STRICT, setiap nilai yang dimasukkan harus sesuai dengan tipe yang dideklarasikan kolom, dan ketidaksesuaian apa pun akan menghasilkan galat.

Mode STRICT meningkatkan konsistensi dan validasi data. Ini juga membantu menangkap kesalahan terkait tipe lebih awal selama pengembangan dan membuat perilaku SQLite lebih dapat diprediksi, lebih mendekati RDBMS tradisional.

Sebelum menggunakan STRICT sebagai pengembang, perlu dicatat bahwa ini hanya tersedia di SQLite 3.37.0 ke atas. Selain itu, Anda tidak dapat mencampur STRICT dan manifest typing dalam tabel yang sama.

Pertimbangan Kinerja dan Desain

SQLite memiliki sistem tipe yang fleksibel dengan implikasi pada kinerja. SQLite menggunakan pengodean panjang variabel untuk nilai INTEGER dan REAL, artinya angka yang lebih kecil menggunakan lebih sedikit byte. Ini membantu meminimalkan ukuran basis data, terutama untuk dataset besar.

Type affinity juga memengaruhi bagaimana nilai disimpan dan dibandingkan. Tipe yang tidak konsisten dalam satu kolom dapat mengurangi efektivitas indeks, karena SQLite mungkin melakukan konversi tipe tambahan saat pencarian, yang memperlambat kueri.

Pertimbangkan strategi berikut untuk merancang skema dan kueri yang efisien.

  • Definisikan kolom dengan affinity yang jelas dan konsisten untuk meminimalkan overhead pemaksaan tipe.

  • Pertimbangkan casting eksplisit dalam kueri saat konversi tipe diperlukan untuk memastikan perilaku yang konsisten.

  • Gunakan affinity INTEGER untuk ID dan pencacah numerik, REAL untuk data floating-point, dan TEXT untuk string.

  • Hindari mencampur tipe data dalam kolom yang sama untuk mencegah keanehan pengurutan dan perbandingan.

  • Normalisasi skema untuk menghindari pemaksaan tipe atau duplikasi data yang redundan.

  • Gunakan EXPLAIN QUERY PLAN untuk menganalisis kinerja dan menyetel kueri.

Contoh Tipe Data SQLite dengan Pola Skema

Skema tabel berikut menggambarkan penggunaan yang cermat atas tipe data, type affinity, dan constraint di SQLite.

Tabel users dengan simulasi boolean dan constraint

Pada contoh di bawah ini:

  • is_active mensimulasikan boolean menggunakan INTEGER dengan constraint CHECK.

  • TEXT memastikan konsistensi untuk nilai string sementara INTEGER digunakan untuk logika mirip boolean.

 -- 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
);

Tabel orders menggunakan data temporal dan presisi numerik

Pada kueri di bawah, total menggunakan NUMERIC untuk nilai mirip mata uang agar presisinya ditangani di tingkat aplikasi. order_date disimpan sebagai TEXT dalam format ISO-8601, memastikan keterbacaan dan kompatibilitas dengan fungsi tanggal.

-- 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)  );

Tabel files dengan biner dan pemeriksaan tipe

Pada kueri di bawah, content menggunakan BLOB untuk menyimpan data biner mentah. uploaded_at menyimpan waktu sebagai INTEGER demi efisiensi ruang dan kinerja.

-- 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 
);

Anda dapat memverifikasi tipe saat runtime dengan kueri berikut:

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

Saya merekomendasikan mengambil kursus Introduction to Relational Databases in SQL kami untuk mempelajari lebih lanjut tentang struktur data dan cara membuat tabel dalam basis data.

Membandingkan SQLite dengan Database Lain

Sistem tipe SQLite lebih fleksibel dibandingkan RDBMS tradisional seperti MySQL atau PostgreSQL. Tabel di bawah membandingkan SQLite dengan database tersebut.

Fitur

SQLite

MySQL

PostgreSQL

Model Pengetikan

Dinamis (manifest typing, type affinity)

Ketat (dengan beberapa keunikan, seperti pemaksaan diam-diam)

Ketat (pengetikan kuat ditegakkan)

Penegakan Tipe yang Dideklarasikan

Tidak ditegakkan (kecuali menggunakan mode STRICT)

Sebagian besar ditegakkan, namun memberi sedikit kelonggaran

Ditegakkan sepenuhnya

Penanganan Boolean

Disimulasikan seperti 0/1, TEXT, NUMERIC.

Memiliki tipe BOOLEAN (TRUE, FALSE)

Tipe BOOLEAN native

Tipe Tanggal/Waktu

Disimpan sebagai TEXT, REAL, atau INTEGER secara manual

Tipe tanggal/waktu native

Tipe temporal native dan ekstensif

Sensitivitas Indeks

Sensitif terhadap tipe campuran dalam satu kolom

Andal karena pengetikan

Andal karena pengetikan

Fleksibilitas Skema

Sangat tinggi (sedikit pembatasan secara default)

Sedang

Terstruktur dan tangguh

Migrasi ke SQLite

Mungkin perlu melonggarkan penegakan tipe yang ketat

Umumnya mulus dengan penyesuaian kecil

Mungkin memerlukan penyederhanaan atau kehilangan presisi

Migrasi dari SQLite

Memerlukan pembersihan data dan normalisasi pengetikan

Memerlukan kesesuaian data dengan pengetikan yang lebih ketat

Memerlukan kesesuaian data dan skema yang lebih ketat

Kesimpulan

SQLite memiliki sistem pengetikan yang fleksibel yang menawarkan berbagai keunggulan jika digunakan dengan cermat. Dengan memahami storage classes, type affinity, dan manifest typing, pengembang dapat merancang skema yang menyeimbangkan adaptabilitas dengan keandalan. Fitur seperti tabel STRICT, penggunaan tipe yang konsisten, dan normalisasi membantu menegakkan struktur saat diperlukan.

Sebagai langkah berikutnya, saya merekomendasikan mengambil kursus Exploratory Data Analysis in SQL dan Data Manipulation in SQL untuk mempelajari cara menganalisis data dengan berbagai tipe data menggunakan kueri SQL tingkat lanjut.

Allan Ouko

Penulis

Allan Ouko

Penulis teknis Data Science dengan pengalaman langsung dalam analitik data, business intelligence, dan data science. Saya menulis konten praktis berfokus industri tentang SQL, Python, Power BI, Databricks, dan rekayasa data, yang berakar pada pekerjaan analitik dunia nyata. Tulisan saya menjembatani kedalaman teknis dan dampak bisnis, membantu para profesional mengubah data menjadi keputusan yang meyakinkan.

FAQs

Apa saja storage classes di SQLite?

Storage classes SQLite meliputi NULL, INTEGER, REAL, TEXT, dan BLOB.

Apakah satu kolom dapat menyimpan beberapa tipe data?

Ya, kecuali tabel dideklarasikan sebagai STRICT, kolom mana pun dapat menampung nilai dengan tipe yang berbeda.

Apa itu type affinity di SQLite?

Type affinity adalah tipe yang direkomendasikan untuk suatu kolom berdasarkan tipe yang dideklarasikan. SQLite mencoba mengonversi nilai yang dimasukkan ke tipe affinity kolom, namun tidak menegakkannya secara ketat.

Bagaimana nilai BOOLEAN ditangani di SQLite?

SQLite tidak memiliki tipe BOOLEAN terpisah. Nilai boolean biasanya disimpan sebagai INTEGER, 0 (FALSE) atau 1 (TRUE), menggunakan affinity NUMERIC.

Bagaimana saya dapat memeriksa bagaimana suatu nilai disimpan?

Gunakan fungsi typeof() untuk memeriksa storage class aktual dari suatu nilai.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai