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.
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.
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 uniquenessCREATETABLE users (
id INTEGERPRIMARYKEY,
username TEXTNOTNULLUNIQUE,
email TEXTNOTNULL,
is_active INTEGERNOTNULLDEFAULT1CHECK(is_active IN(0,1))-- Simulates boolean);Didukung oleh
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"CREATETABLE orders (
order_id INTEGERPRIMARYKEY,
customer_id INTEGERNOTNULL,
total NUMERICNOTNULL,
order_date TEXTNOTNULLCHECK(length(order_date)=10));Didukung oleh
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)CREATETABLE files (
file_id INTEGERPRIMARYKEY,
name TEXTNOTNULL,
content BLOBNOTNULL,
uploaded_at INTEGERNOTNULL);Didukung oleh
Anda dapat memverifikasi tipe saat runtime dengan kueri berikut:
SELECT typeof(uploaded_at), typeof(content)FROM files;Didukung oleh
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.
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.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
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:
NULLmerepresentasikan nilai yang hilang atau tidak terdefinisi.INTEGERmerepresentasikan bilangan bulat bertanda yang disimpan dalam 1 hingga 8 byte, tergantung besarnya nilai.REALmenggambarkan bilangan floating-point yang disimpan sebagai nilai IEEE-754 8 byte.TEXTmenyimpan string teks yang dikodekan dalam UTF-8, UTF-16BE, atau UTF-16LE.BLOBmenyimpan data biner persis seperti inputnya, tanpa transformasi apa pun.Tipe Data SQLite. Sumber Gambar: OpenAI
Storage classes ini berbeda dari tipe data yang dideklarasikan dalam skema tabel. Kolom dapat dideklarasikan sebagai
VARCHAR(50)atauBOOLEAN, 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, atauTEXTmendapatkan affinityTEXT.Tipe seperti
INTdanINTEGERmendapatkan affinityINTEGER.Deklarasi seperti
DECIMAL,NUMERIC, atauBOOLEANmendapatkan affinityNUMERIC.Tipe seperti
REAL,FLOAT, atauDOUBLEmendapatkan affinityREAL.Affinity akan menjadi
BLOBsecara default jika tidak ada tipe yang dikenali dideklarasikan.Sebagai contoh, kolom yang dideklarasikan sebagai
VARCHAR(100)akan memiliki affinityTEXT, 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
INTEGERdapat menampung nilaiTEXTatauBLOB.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, danBOOLEAN, tetapi menyimpan nilai berdasarkan type affinity, bukan tipe yang ketat. Berikut adalah kasus penggunaan untuk setiap tipe data dalam skema dunia nyata.TEXTmenyimpan string, cocok untuk nama, email, URL, dan data tekstual umum.INTEGERideal untuk bilangan bulat seperti hitungan, ID, dan kode, menawarkan penyimpanan dan pengurutan yang efisien.REALmenyimpan bilangan floating-point untuk pengukuran, mata uang, atau nilai non-integer.Affinity
NUMERICmencakup nilai yang dideklarasikan sebagaiDECIMAL,BOOLEAN, atau serupa. Bergantung pada nilainya, SQLite akan mencoba menyimpannya sebagaiINTEGERatauREAL.BOOLEANbukan storage class native tetapi disimulasikan dengan menyimpan0(FALSE) atau1(TRUE) sebagai nilaiINTEGERdi balik layar.Saya merekomendasikan menggunakan
INTEGERuntuk boolean dengan pembatasan eksplisit di sisi aplikasi, sementaraNUMERICtepat untuk nilai yang memerlukan parsing angka yang fleksibel.Tanggal, waktu, dan strategi temporal
SQLite tidak memiliki tipe
DATEatauDATETIMEnative, tetapi mendukung format berikut untuk menyimpan data temporal:TEXT: Menyimpan tanggal/waktu sebagai string ISO8601 sepertiYYYY-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(), danstrftime()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 dataBLOB, 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^63hingga2^63-1), nilai di luar rentang ini mungkin diam-diam dikonversi ke tipe dataREAL. 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
STRICTpada versi 3.37.0. TabelSTRICTmenyediakan mode pengetikan yang lebih ketat yang menegakkan kecocokan tipe secara tepat untuk nilai kolom. Saat Anda mendeklarasikan tabel sebagaiSTRICT, setiap nilai yang dimasukkan harus sesuai dengan tipe yang dideklarasikan kolom, dan ketidaksesuaian apa pun akan menghasilkan galat.Mode
STRICTmeningkatkan 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
STRICTsebagai pengembang, perlu dicatat bahwa ini hanya tersedia di SQLite 3.37.0 ke atas. Selain itu, Anda tidak dapat mencampurSTRICTdan 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
INTEGERdanREAL, 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
INTEGERuntuk ID dan pencacah numerik,REALuntuk data floating-point, danTEXTuntuk 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 PLANuntuk 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_activemensimulasikan boolean menggunakanINTEGERdengan constraintCHECK.TEXTmemastikan konsistensi untuk nilai string sementaraINTEGERdigunakan untuk logika mirip boolean.Tabel orders menggunakan data temporal dan presisi numerik
Pada kueri di bawah,
totalmenggunakanNUMERICuntuk nilai mirip mata uang agar presisinya ditangani di tingkat aplikasi.order_datedisimpan sebagaiTEXTdalam format ISO-8601, memastikan keterbacaan dan kompatibilitas dengan fungsi tanggal.Tabel files dengan biner dan pemeriksaan tipe
Pada kueri di bawah,
contentmenggunakanBLOBuntuk menyimpan data biner mentah.uploaded_atmenyimpan waktu sebagaiINTEGERdemi efisiensi ruang dan kinerja.Anda dapat memverifikasi tipe saat runtime dengan kueri berikut:
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
BOOLEANnativeTipe Tanggal/Waktu
Disimpan sebagai
TEXT,REAL, atauINTEGERsecara manualTipe 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.