Lima Storage Class, Bukan Banyak Tipe
SQLite menyimpan setiap nilai sebagai salah satu dari lima storage class:
NULL: tidak ada nilai.INTEGER: bilangan bulat bertanda, 1 sampai 8 byte tergantung besarnya.REAL: bilangan floating-point IEEE 8 byte.TEXT: string, disimpan dalam encoding database (biasanya UTF-8).BLOB: byte mentah, disimpan persis seperti yang kamu berikan.
Hanya itu. Tidak ada BOOLEAN, DATETIME, VARCHAR, atau DECIMAL yang terpisah. Database lain punya puluhan tipe; SQLite punya lima, dan semua hal lain dibangun di atasnya.
typeof() melaporkan storage class sebenarnya dari setiap nilai. Kamu akan melihat integer, real, text, blob. Keempatnya, ditambah null, adalah semua yang diketahui SQLite.
Tipe Datanya Dinamis
Inilah bagian yang mengejutkan orang yang terbiasa dengan Postgres atau MySQL. Di SQLite (tanpa STRICT), tipe yang kamu deklarasikan pada kolom lebih mirip saran daripada kontrak. Tipe sebenarnya melekat pada setiap nilai:
Kedua baris diterima. Kolom id berisi integer di satu baris dan teks di baris lain; body berisi teks dan integer. SQLite dengan senang hati menyimpan nilai dari storage class apa pun di kolom mana pun.
Inilah dynamic typing, dan ini pilihan desain yang disengaja. SQLite jadi pemaaf untuk membuat prototipe dan skrip singkat. Tapi itu juga berarti salah ketik di kode aplikasimu bisa diam-diam menyimpan data dengan bentuk yang salah selama bertahun-tahun. Kalau pertukaran ini mengganggumu, dan untuk sebagian besar skema production memang seharusnya begitu, tabel STRICT adalah jawabannya. Kita akan sampai ke sana sebentar lagi.
Type Affinity dalam Satu Paragraf
Tipe yang dideklarasikan pada kolom tidak diabaikan; tipe itu memberi kolom sebuah affinity. Saat kamu memasukkan nilai, SQLite mencoba mengubahnya ke arah affinity kolom kalau konversi yang bersih memungkinkan. Kolom TEXT yang menerima angka 42 menyimpannya sebagai teks '42'; kolom INTEGER yang menerima string '42' menyimpannya sebagai integer 42. Kalau konversi akan menghilangkan informasi, tipe aslinya dipertahankan.
Baris pertama: integer 42 diubah menjadi teks '42', dan string '100' diubah menjadi integer 100. Baris kedua: '3.5' tidak bisa diubah ke INTEGER tanpa kehilangan informasi, jadi tetap berupa teks. Affinity punya halaman sendiri nanti. Untuk sekarang, cukup ketahui bahwa tipe kolom tetap memengaruhi penyimpanan, meskipun tidak menegakkannya.
Boolean
Tidak ada storage class BOOLEAN. SQLite menyimpan boolean sebagai integer: 0 untuk false, 1 untuk true:
Kata kunci TRUE dan FALSE dikenali (sejak SQLite 3.23) dan diterjemahkan menjadi 1 dan 0. Deklarasi BOOLEAN memberi kolom affinity numerik, tapi tidak membatasinya ke 0/1. Tanpa STRICT, kamu bisa memasukkan 'maybe' dan SQLite tidak akan keberatan.
Tanggal dan Waktu
DATETIME juga tidak ada. Kamu memilih salah satu dari tiga format penyimpanan, dan fungsi tanggal SQLite bekerja pada semuanya:
TEXTsebagai ISO-8601:'2026-04-23 14:30:00'.REALsebagai angka Julian day.INTEGERsebagai detik Unix epoch.
Teks ISO-8601 adalah pilihan yang paling umum: urutannya benar saat diurutkan sebagai string, mudah dibaca manusia, dan fungsi bawaannya (date(), time(), datetime(), strftime(), julianday()) semuanya menerimanya. Pilih satu format per kolom dan konsistenlah. Mencampur format dalam satu kolom adalah jenis hal yang akan merepotkanmu enam bulan kemudian.
VARCHAR, CHAR, dan Nama Lain yang Akrab
SQLite menerima nama tipe yang kamu kenal dari database lain: VARCHAR(255), CHAR(10), NVARCHAR, DECIMAL(10,2), DOUBLE, FLOAT, INT, BIGINT, MEDIUMINT. Semuanya bisa di-parse tanpa masalah. Hanya saja, semuanya dipetakan ke salah satu dari lima storage class lewat aturan affinity.
VARCHAR(255) tidak menegakkan batas 255 karakter, karena SQLite mengabaikan panjangnya. DECIMAL(10, 2) tidak menyimpan desimal dengan presisi tetap: kolom itu mendapat affinity numerik dan disimpan sebagai INTEGER atau REAL. Nama-nama ini ada semata-mata agar skema yang disalin dari database lain bisa berjalan; nama itu tidak membawa constraint yang biasanya tersirat di database lain.
Kalau kamu butuh aritmetika desimal yang tepat untuk uang, simpan nilai dalam sen sebagai INTEGER. REAL yang berupa floating-point cepat atau lambat akan menimbulkan error pembulatan di angka desimal ketiga.
NULL Adalah Storage Class
NULL bukan sekadar "tidak ada nilai": ia adalah nilai dengan storage class sendiri, yang dikembalikan oleh typeof():
b dilaporkan sebagai null. Ini penting karena NULL tidak sama dengan apa pun, bahkan dengan NULL lain. b = NULL tidak pernah bernilai true; kamu harus menulis b IS NULL. Hal ini dibahas lebih tuntas di halaman operator dan NULL nanti, tapi semuanya dimulai di sini, dengan storage class.
Menyimpan Byte dengan BLOB
BLOB menyimpan byte mentah apa adanya. Berguna untuk gambar kecil, hash, data yang di-encode, atau apa pun yang bukan teks atau angka:
Literal x'...' memungkinkanmu menulis blob dalam bentuk hex di SQL; dari kode aplikasi, kamu biasanya mengirim array byte lewat parameter. length() pada blob mengembalikan jumlah byte, bukan jumlah karakter.
Catatan praktis: SQLite dengan senang hati menyimpan blob besar, tapi menarik blob 50 MB lewat setiap query yang menyentuh baris itu terasa lambat. Untuk file besar, simpan file-nya di disk dan simpan path-nya di database.
Yang Perlu Kamu Ingat
- Lima storage class, yaitu
NULL,INTEGER,REAL,TEXT,BLOB, mencakup semuanya. - Boolean adalah integer; tanggal berupa teks, real, atau integer (sesuai pilihanmu).
- Tipe kolom yang dideklarasikan adalah petunjuk, bukan kontrak (kecuali kamu memakai
STRICT). VARCHAR(255)dan kawan-kawannya bisa di-parse, tapi tidak menegakkan panjang atau presisi yang biasanya tersirat di database lain.typeof(value)adalah temanmu setiap kali kamu tidak yakin apa yang sebenarnya tersimpan.
Berikutnya: Type Affinity
Perilaku "petunjuk" yang tadi kita bahas sekilas punya aturan yang tepat di baliknya: lima kelas affinity yang diturunkan dari nama tipe yang dideklarasikan, dan diterapkan setiap kali kamu memasukkan data. Itu halaman berikutnya, dan itulah kunci untuk memprediksi apa yang sebenarnya akan dilakukan SQLite pada nilai yang kamu berikan.
Pertanyaan yang sering diajukan
Tipe data apa saja yang didukung SQLite?
SQLite punya lima storage class: NULL, INTEGER, REAL, TEXT, dan BLOB. Setiap nilai di database disimpan sebagai salah satu dari kelima itu. Nama yang sudah akrab seperti VARCHAR(255), DATETIME, atau BOOLEAN diterima di CREATE TABLE demi kompatibilitas, tapi saat disimpan, semuanya dipetakan ke salah satu dari lima storage class itu.
Apakah SQLite punya tipe boolean atau datetime?
Tidak sebagai storage class tersendiri. Boolean disimpan sebagai INTEGER (0 dan 1), meskipun SQLite juga mengenali kata kunci TRUE dan FALSE. Tanggal dan waktu disimpan sebagai TEXT (string ISO-8601), REAL (angka Julian day), atau INTEGER (detik Unix epoch). Kamu yang memilih format penyimpanannya, dan fungsi tanggal bekerja pada ketiganya.
Kenapa tipe data di SQLite disebut dinamis?
Di sebagian besar database, kolom yang dideklarasikan sebagai INTEGER menolak string. Di SQLite (secara bawaan), tipe yang dideklarasikan hanyalah petunjuk: tipe sebenarnya ikut bersama setiap nilai, jadi kolom TEXT bisa berisi integer kalau kamu memasukkannya. Fleksibilitas ini kadang berguna dan kadang menjadi jebakan. Tabel STRICT mematikannya.