Saya tertarik terutama pada MySQL dan PostgreSQL, tetapi Anda dapat menjawab yang berikut secara umum:
- Apakah ada skenario logis yang akan berguna untuk membedakan string kosong dari NULL?
Apa yang akan menjadi implikasi penyimpanan fisik untuk menyimpan string kosong sebagai ...
- BATAL?
- String Kosong?
- Bidang lain?
- Ada cara lain?
null
feature-comparison
empty-string
Maniero
sumber
sumber
NULL
atau tidakSaya tidak tahu tentang MySQL dan PostgreSQL, tetapi biarkan saya memperlakukan ini secara umum.
Ada satu DBMS yaitu Oracle yang tidak memungkinkan untuk memilih pengguna antara NULL dan ''. Ini jelas menunjukkan bahwa tidak perlu untuk membedakan keduanya. Ada beberapa konsekuensi yang menjengkelkan:
Anda mengatur varchar2 ke string kosong seperti ini:
berikut ini mengarah pada hasil yang sama
Tetapi untuk memilih kolom di mana nilainya kosong atau NULL, Anda harus menggunakan
Menggunakan
secara sintaksis benar, tetapi tidak pernah mengembalikan baris.
Di sisi lain, ketika merangkai string di Oracle. NULL varchars diperlakukan sebagai string kosong.
hasil abc . DBMS lain akan mengembalikan NULL dalam kasus ini.
Ketika Anda ingin mengekspresikan secara eksplisit, bahwa suatu nilai diberikan, Anda harus menggunakan sesuatu seperti ''.
Dan Anda harus khawatir apakah memangkas tidak menghasilkan kosong di NULL
Itu benar.
Sekarang melihat DBMS di mana '' tidak identik dengan NULL (mis. SQL-Server)
Bekerja dengan '' umumnya lebih mudah dan dalam kebanyakan kasus tidak ada kebutuhan praktis untuk membedakan keduanya. Salah satu pengecualian yang saya tahu, adalah ketika kolom Anda mewakili beberapa pengaturan dan Anda belum mengosongkan default untuk mereka. Saat Anda dapat membedakan antara '' dan NULL, Anda dapat menyatakan bahwa pengaturan Anda kosong dan menghindari penerapan default.
sumber
Itu tergantung pada domain yang sedang Anda kerjakan.
NULL
berarti tidak adanya nilai (yaitu tidak ada nilai ), sedangkan string kosong berarti ada nilai string dengan panjang nol.Misalnya, Anda memiliki tabel untuk menyimpan data seseorang dan itu berisi
Gender
kolom. Anda dapat menyimpan nilai sebagai 'Pria' atau 'Wanita'. Jika pengguna dapat memilih untuk tidak memberikan data gender, Anda harus menyimpannya sebagaiNULL
(yaitu pengguna tidak memberikan nilai) dan bukan mengosongkan string (karena tidak ada gender dengan nilai '').sumber
Satu hal yang perlu diingat adalah bahwa ketika Anda memiliki bidang yang tidak diperlukan, tetapi nilai apa pun yang ada harus unik akan mengharuskan Anda untuk menyimpan nilai kosong sebagai NULL. Jika tidak, Anda hanya akan dapat memiliki satu tuple dengan nilai kosong di bidang itu.
Ada juga beberapa perbedaan dengan aljabar relasional dan nilai NULL: NULL! = NULL, misalnya.
sumber
UNIQUE
batasan. Untungnya, mulai tahun 2008 Anda dapat menggunakan indeks yang difilter untuk mendapatkan perilaku yang tepat.Anda mungkin juga memperhitungkan kritik Date tentang NULL dan masalah 3VL dalam SQL dan Teori Relasional (dan kritik Rubinson tentang kritik Date, Nulls, Logika Berharga Tiga, dan Ambiguitas dalam SQL: Kritik Date Critquing ).
Keduanya direferensikan dan dibahas panjang lebar dalam utas SO terkait, Opsi untuk menghilangkan kolom NULLable dari model DB .
sumber
Sebuah pikiran baru, pengaruh besar pada pilihan Anda
NULL
/NOT NULL
adalah jika Anda menggunakan kerangka. Saya menggunakan banyak symfony dan menggunakanNULL
bidang yang memungkinkan menyederhanakan beberapa kode dan memeriksa data ketika memanipulasi data.Jika Anda tidak menggunakan kerangka kerja atau jika Anda menggunakan pernyataan dan pemrosesan sql sederhana, saya akan memilih mana saja yang Anda rasa lebih mudah untuk dilacak. Saya biasanya lebih suka NULL sehingga melakukan
INSERT
pernyataan tidak membosankan dengan lupa mengatur bidang kosongNULL
.sumber
Setelah harus bekerja dengan Oracle ( yang tidak memungkinkan Anda untuk membedakan ) saya sampai pada kesimpulan berikut:
Dari POV logis tidak masalah. Saya benar-benar tidak bisa memikirkan contoh menarik di mana membedakan antara NULL dan nol-panjang-string menambahkan nilai apa pun di DBMS.
Dari yang berikut: Anda juga memiliki
NULL
kolom mampu yang tidak mengizinkan zero-len''
(solusi Oracle-ish) atauNOT NULL
kolom yang memungkinkan zero-len.Dan dari pengalaman saya,
''
membuat banyak lebih masuk akal ketika memproses data, seperti yang biasanya Anda ingin memproses tanpa adanya string sebagai string kosong: Penggabungan, Perbandingan, dllCatatan: Untuk kembali ke pengalaman Oracle saya: Katakan Anda ingin membuat permintaan untuk permintaan pencarian. Jika Anda menggunakan,
''
Anda bisa menghasilkanWHERE columnX = <searchvalue>
dan itu akan bekerja untuk pencarian kesetaraan. Jika Anda menggunakanNULL
yang harus Anda lakukanWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. Bah! :-)sumber
Mereka juga berbeda dari perspektif desain:
misalnya
Seperti:
Mari kita memasukkan beberapa data:
Sekarang mari kita coba dengan nol:
Ini dibolehkan
Soooooo: nulls bukan string sepele atau sebaliknya.
Tepuk tangan
sumber
Jika kita berbicara tentang teori, maka aturan Codd mengatakan bahwa RDBMS harus memperlakukan
NULL
nilai dengan cara khusus.Bagaimana tepatnya yang digunakan tergantung pada arsitek basis data, tergantung pada domain aktual - tugas - proyek - aplikasi - area.
sumber