Apakah SQLite akan kurang bermanfaat tanpa menerima sisipan nilai-nilai non-numerik ke dalam kolom numerik?

10

Dalam SQLite pernyataan berikut akan berhasil dan string akan dimasukkan / diperbarui ke dalam SALARYkolom yang bertipe INTEGER:

update employee set salary='TOO MUCH' where emp_id=1;

Perhatikan bahwa nol tidak akan dimasukkan / diperbarui tetapi string "TERLALU JAUH" yang sebenarnya , jadi ini bukan tentang konversi jenis automatis.

FAQ menyatakan:

Ini adalah fitur , bukan bug. SQLite menggunakan pengetikan dinamis. Itu tidak menegakkan batasan tipe data. Data jenis apa pun dapat (biasanya) dimasukkan ke dalam kolom apa pun. Anda dapat menempatkan string panjang acak ke dalam kolom integer, angka floating point di kolom boolean, atau tanggal di kolom karakter. Tipe data yang Anda tetapkan untuk kolom dalam perintah CREATE TABLE tidak membatasi data apa yang dapat dimasukkan ke dalam kolom itu. Setiap kolom dapat memiliki string panjang acak. (Ada satu pengecualian: Kolom tipe INTEGER PRIMARY KEY hanya dapat menampung bilangan bulat bertanda 64-bit. Kesalahan akan terjadi jika Anda mencoba memasukkan apa pun selain bilangan bulat ke dalam kolom INTEGER PRIMARY KEY kolom.)

Jadi perilaku ini jelas disengaja, namun saya bertanya - tanya mengapa SQLite memiliki perilaku ini, karena sebagian besar database SQL lain yang saya tahu berperilaku sangat berbeda, mereka akan menimbulkan kesalahan, atau mengonversi string 0, ketika mencoba memasukkan string non-numerik ke dalam kolom angka

  • Apakah perpustakaan SQLite menjadi kurang bermanfaat tanpa perilaku ini?

  • Apakah ini dibuat dengan desain agar perpustakaan tetap kecil dan cepat?

  • Apakah pustaka SQLite secara signifikan lebih lambat atau lebih besar untuk menimbulkan kesalahan ketika mencoba memasukkan string ke dalam kolom numerik?

Tulains Córdova
sumber
9
Seseorang pernah berkata bahwa "fitur adalah bug seperti yang dijelaskan oleh departemen pemasaran".
Dan Pichelman
3
Saya ragu itu bagus untuk kinerja dan kepadatan data, meskipun mungkin bermanfaat untuk ukuran kode. Semua dalam semua, saya akan menyebutnya fitur salah disengaja (atau setidaknya diadopsi).
Deduplicator
3
"Sepertinya bagi saya batasan yang diberlakukan untuk tetap menjadi perpustakaan kecil, sumber daya rendah biasanya digunakan untuk sistem embed yang membutuhkan kinerja waktu nyata ..." Saya tidak bisa membayangkan jenis pemeriksaan menjadi apa pun lebih dari setetes bucket kinerja waktu / ruang untuk operasi yang melakukan sejumlah IO disk. Mereka juga harus memiliki pemeriksaan tambahan dalam kode karena mereka tidak bisa begitu saja menganggap data akan memiliki ukuran tetap, jadi bisa dibilang biaya pengetikan dinamis kinerja Anda.
Doval
1
@DocBrown Bukan karena saya mengatakannya tetapi karena sui generis .
Tulains Córdova
2
@ user61852 Saya sarankan Anda menulis ulang pertanyaan sepenuhnya dan fokus pada apakah pengetikan dinamis SQLite akan memberikan manfaat kinerja, dan mengabaikan penyebutan fitur / bug bug atau kegunaan umum / kegunaan dari pengetikan dinamis dalam konteks X atau Y.
Doval

Jawaban:

8

Tidak, pengetikan dinamis membutuhkan lebih banyak ruang penyimpanan dan lebih banyak waktu pemrosesan, terutama karena mereka juga menambah afinitas jenis, artinya memiliki jenis yang disukai yang tidak dapat diabaikan oleh pemrogram. Ini benar-benar fitur yang disengaja dengan biaya trade off nyata. Biaya-biaya tersebut secara efektif diabaikan untuk kasus penggunaan target SQLite, tetapi mereka masih ada.

Kegunaan fitur-fitur tersebut sulit dilihat karena Anda tidak terbiasa menyediakannya untuk Anda. Solusi untuk kekurangannya terasa lebih alami bagi Anda sekarang. Karena pengalaman Anda sebelumnya, Anda menganggapnya sebagai bidang INTEGER yang tidak akan pernah menjadi apa pun, tetapi SQLite melihatnya lebih sebagai bidang jenis apa pun, tetapi mungkin sebagian besar berisi bilangan bulat. Mungkin itu adalah kode ZIP untuk perusahaan yang sebagian besar melakukan bisnis di AS, tetapi memiliki beberapa pelanggan Kanada. Mengizinkan pengguna untuk menentukan afinitas integer akan menghemat banyak ruang untuk menjadikannya string di setiap baris, tetapi tetap memberi Anda opsi itu.

Karl Bielefeldt
sumber
3
Saya menulis pembaruan untuk pertanyaan saya tentang berhasil menyimpan string "TERLALU BANYAK" ke dalam colum numerik. Konversi otomatis akan memasukkan nol. Juga ini adalah implementasi basis data relasional pertama yang saya tahu akan memungkinkan itu. Saya telah bekerja dengan MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL dan Sybase SQL Anywhere.
Tulains Córdova
2
Saya tidak mengerti komentar Anda. Jawaban saya tidak ada hubungannya dengan konversi otomatis.
Karl Bielefeldt
1
SQLite menganggap mereka kelas penyimpanan bukan tipe data. sqlite.org/datatype3.html
JeffO
1
Upvoted untuk ditulis dengan jelas, tetapi Anda akan mengabaikan masalah penyebab ini membuktikan keakuratan data. Anda tidak dapat menarik beberapa bilangan bulat dari DB dan menganggap bahwa itu adalah bilangan bulat. ("Pengetikan dinamis" sangat bertentangan dengan model relasional yang sebenarnya .)
Wildcard
1
Biaya pengabaian mengetik sepenuhnya jauh lebih tinggi daripada sedikit ruang penyimpanan dan waktu prosesor.
DeadMG