Saat membuat tabel di SQLite3, saya bingung saat dihadapkan dengan semua kemungkinan tipe data yang menyiratkan konten serupa, jadi adakah yang bisa memberi tahu saya perbedaan antara tipe data berikut?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Apakah ada beberapa dokumentasi di suatu tempat yang mencantumkan min./max. kapasitas dari berbagai tipe data? Misalnya, saya kira smallint
memiliki nilai maksimum yang lebih besar dari tinyint
, tetapi nilai yang lebih kecil dari bilangan bulat, tetapi saya tidak tahu apa kapasitas ini.
DATE
atauBOOLEAN
, tetapi saya tidak akan repot-repot membedakan berbagai ukuran bilangan bulat. Hal ini terutama berlaku untuk kasusINTEGER PRIMARY KEY
, satu kasus di mana nama tipe yang tepat penting.Perbedaannya adalah gula sintaksis. Hanya beberapa substring dari nama tipe yang penting sebagai afinitas tipe yang bersangkutan.
Aturan untuk menentukan afinitas dicantumkan di situs SQLite .
Jika Anda bersikeras pada pengetikan yang ketat, Anda dapat menerapkannya dengan
CHECK
batasan:Tapi saya tidak pernah peduli dengan itu.
Adapun kapasitas masing-masing type:
INTEGER
selalu ditandatangani 64-bit. Perhatikan bahwa SQLite mengoptimalkan penyimpanan bilangan bulat kecil di belakang layar, jadi TINYINT tidak akan berguna.REAL
selalu 64-bit (double
).TEXT
danBLOB
memiliki ukuran maksimum yang ditentukan oleh makro praprosesor, yang defaultnya adalah 1.000.000.000 byte.sumber
TYPEOF
. Jadi, upaya untuk memasukkan TEXT yang sebaliknya akan dikonversi ke kelas penyimpanan NUMERIC / INTEGER oleh SQlite (yaitu, konversi seperti itu tanpa kerugian seperti per sqlite.org/datatype3.html#affinity ) akan gagal. Dengan kata lain, pendekatan ini lebih ketat daripada pendekatan ad-hoc dalam memasukkan nilai dan kemudian secara ajaib memvalidasi kelas penyimpanan yang digunakan untuk menyimpan nilai tersebut oleh SQLite. Untuk pendekatan yang lebih permisif, lihat jawaban saya di bawah ini.Sebagian besar ada untuk kompatibilitas. Anda benar-benar hanya memiliki integer, float, teks, dan blob. Tanggal dapat disimpan sebagai angka (waktu unix adalah integer, waktu microsoft adalah float) atau sebagai teks.
sumber
NULL
. Nilainya adalah nilai NULL.INTEGER
. Nilainya adalah bilangan bulat bertanda, disimpan dalam 1, 2, 3, 4, 6, atau 8 byte tergantung pada besarnya nilai.REAL
. Nilainya adalah nilai floating point, disimpan sebagai angka floating point IEEE 8-byte.TEXT
. Nilainya adalah string teks, disimpan menggunakan encoding database (UTF-8, UTF-16BE atau UTF-16LE).BLOB
. Nilai adalah sekumpulan data, disimpan persis seperti saat dimasukkan.sumber
Sebagai tambahan untuk jawaban dari dan04, jika Anda ingin memasukkan secara membabi buta
NUMERIC
selain nol yang diwakili oleh aTEXT
tetapi pastikan teks tersebut dapat diubah menjadi numerik:Kasus penggunaan umum ada dalam kueri dari program yang memperlakukan semua data sebagai teks (untuk keseragaman & kesederhanaan, karena SQLite sudah melakukannya). Hal yang menyenangkan tentang ini adalah memungkinkan konstruksi seperti ini:
yang nyaman jika Anda menggunakan placeholder karena Anda tidak harus menangani bidang numerik bukan nol secara khusus. Contoh menggunakan
sqlite3
modul Python adalah ,Dalam contoh di atas, semua nilai di
str_value_tuple
akan di -escape dan dikutip sebagai string saat diteruskan ke SQlite. Namun, karena kami tidak memeriksa secara eksplisit tipe melaluiTYPEOF
tetapi hanya konvertibilitas ke tipe , ini akan tetap berfungsi seperti yang diinginkan (yaitu, SQLite akan menyimpannya sebagai numerik atau gagal jika tidak).sumber