Saya tahu subjek ini sedikit kontroversial dan ada banyak berbagai artikel / opini beredar di internet. Sayangnya, sebagian besar dari mereka menganggap orang itu tidak tahu apa perbedaan antara NULL dan string kosong. Jadi mereka bercerita tentang hasil yang mengejutkan dengan bergabung / agregat dan umumnya melakukan pelajaran SQL sedikit lebih maju. Dengan melakukan ini, mereka benar-benar kehilangan inti dan karena itu tidak berguna bagi saya. Jadi semoga pertanyaan ini dan semua jawaban akan sedikit bergerak maju.
Misalkan saya memiliki tabel dengan informasi pribadi (nama, kelahiran, dll) di mana salah satu kolom adalah alamat email dengan tipe varchar. Kami berasumsi bahwa karena alasan tertentu beberapa orang mungkin tidak ingin memberikan alamat email. Saat memasukkan data seperti itu (tanpa email) ke dalam tabel, ada dua pilihan yang tersedia: setel ke NULL atau setel ke string kosong (''). Mari kita asumsikan bahwa saya menyadari semua implikasi teknis dari memilih satu solusi di atas yang lain dan saya dapat membuat query SQL yang benar untuk kedua skenario. Masalahnya adalah bahkan ketika kedua nilai berbeda pada tingkat teknis, mereka sama persis pada tingkat logis. Setelah melihat NULL dan '' Saya sampai pada satu kesimpulan: Saya tidak tahu alamat email orang itu. Juga tidak peduli seberapa keras saya mencoba, Saya tidak dapat mengirim email menggunakan NULL atau string kosong, jadi tampaknya sebagian besar server SMTP di luar sana setuju dengan logika saya. Jadi saya cenderung menggunakan NULL di mana saya tidak tahu nilai dan menganggap string kosong adalah hal yang buruk.
Setelah beberapa diskusi intens dengan rekan-rekan saya datang dengan dua pertanyaan:
apakah saya benar dengan berasumsi bahwa menggunakan string kosong untuk nilai yang tidak diketahui menyebabkan database "berbohong" tentang fakta? Untuk lebih tepatnya: menggunakan ide SQL tentang apa itu nilai dan apa yang tidak, saya mungkin sampai pada kesimpulan: kita memiliki alamat email, hanya dengan mengetahui itu bukan nol. Tetapi kemudian, ketika mencoba mengirim e-mail saya akan sampai pada kesimpulan yang bertentangan: tidak, kami tidak memiliki alamat e-mail, bahwa @! # $ Database pasti berbohong!
Apakah ada skenario logis di mana string kosong '' bisa menjadi pembawa informasi penting yang baik (selain nilai dan tidak ada nilai), yang akan merepotkan / tidak efisien untuk disimpan dengan cara lain (seperti kolom tambahan). Saya telah melihat banyak posting yang mengklaim bahwa kadang-kadang ada baiknya menggunakan string kosong bersama dengan nilai nyata dan NULL, tetapi sejauh ini belum melihat skenario yang logis (dalam hal desain SQL / DB).
PS Beberapa orang akan tergoda untuk menjawab, bahwa itu hanya masalah selera pribadi. Saya tidak setuju. Bagi saya itu adalah keputusan desain dengan konsekuensi penting. Jadi saya ingin melihat jawaban di mana pendapat tentang ini didukung oleh beberapa alasan logis dan / atau teknis.
''
bahkan di Oracle, tidak sama denganNULL
. Misalnya, memberikanCHAR(1)
kolom nilai yang''
akan dihasilkan' '
(yaitu spasi), bukanNULL
. Selain itu, jika Jacek menggunakan Oracle, pertanyaan ini kemungkinan tidak akan muncul :-)'' IS NULL
dievaluasitrue
dalam PL / SQL.Jawaban:
Saya akan mengatakan itu
NULL
adalah pilihan yang tepat untuk "tidak ada alamat email". Ada banyak alamat email "tidak valid", dan "" (string kosong) hanyalah satu. Misalnya "foo" bukan alamat email yang valid, "a @ b @ c" tidak valid dan sebagainya. Jadi hanya karena "" bukan alamat email yang valid, tidak ada alasan untuk menggunakannya sebagai nilai "tidak ada alamat email".Saya pikir Anda benar dalam mengatakan bahwa "" bukan cara yang tepat untuk mengatakan "Saya tidak memiliki nilai untuk kolom ini". "" adalah sebuah nilai.
Contoh di mana "" mungkin nilai yang valid, terpisah
NULL
bisa jadi nama tengah seseorang. Tidak setiap orang memiliki nama tengah, jadi Anda perlu membedakan antara "tidak ada nama tengah" ("" - string kosong) dan "Saya tidak tahu apakah orang ini memiliki nama tengah atau tidak" (NULL
). Mungkin ada banyak contoh lain di mana string kosong masih merupakan nilai yang valid untuk sebuah kolom.sumber
NULL
tidak berarti bahwa tidak ada alamat email, saya pikir itu berarti bahwa alamat email saat ini tidak diketahui, tidak diketahui keberadaannya, atau tidak mungkin diisi karena alasan lain. Untungnya, mungkin tidak ada situasi di mana seseorang ingin menyimpan dalam database informasi tentang orang-orang yang benar-benar tidak memiliki dan tidak berencana untuk memiliki alamat email, jika tidak, bidang boolean yang terpisah mungkin diperlukan.Sementara setuju dengan komentar di atas, saya akan menambahkan argumen ini sebagai motivasi utama:
Demi Self-Documenting Intuitive Coding, gunakan NULL sebagai ganti string kosong.
sumber
Dalam contoh Anda jika nilai langsung dari bidang web - saya akan menggunakan string kosong. Jika pengguna dapat opsi untuk menentukan bahwa ia tidak ingin memberikan email, atau bisa menghapusnya - maka NULL.
Berikut ini tautan dengan poin yang dapat Anda pertimbangkan: https://stackoverflow.com/questions/405909/null-vs-empty-when-dealing-with-user-input/405945#405945
--- diedit (Membalas komentar Thomas) ---
Basis data tidak hidup tanpa aplikasi yang menggunakannya. Menentukan NULL atau '' tidak memiliki nilai, jika aplikasi tidak dapat menggunakannya dengan benar.
Pertimbangkan satu contoh di mana pengguna mengisi formulir PANJANG dan tekan enter, yang akan mengirim permintaan tetap ke server. Dia mungkin berada di tengah memasukkan emailnya. Kemungkinan besar Anda ingin menyimpan apa pun yang dia miliki di bidang email, sehingga nanti dia bisa menyelesaikannya. Bagaimana jika dia hanya memasukkan satu karakter? Bagaimana jika dia memasukkan satu karakter dan kemudian menghapusnya? Ketika email tidak diperlukan, kadang-kadang pengguna ingin menghapusnya: cara termudah untuk menghapus bidang. Juga dalam hal ketika email tidak diperlukan, ada baiknya untuk memvalidasi sebelum mengirim.
Contoh lain: pengguna memberikan email sebagai spam ke @ [perusahaan besar] .com - dalam hal ini tidak perlu mengirim email, meskipun itu ada dan valid (dan bahkan mungkin ada). Mengirim yang satu mungkin murah, tetapi jika ada 10 ribu pengguna dengan email seperti itu untuk langganan harian, maka validasi seperti itu dapat menghemat banyak waktu.
sumber
Saya pikir jawaban Dean Hardings mencakup ini dengan sangat baik. Yang mengatakan saya ingin menyebutkan bahwa ketika berbicara tentang string NULL vs kosong di tingkat DB Anda harus memiliki pemikiran tentang tipe data Anda yang lain. Apakah Anda menyimpan tanggal minimum ketika tidak ada tanggal yang disediakan? atau -1 ketika tidak ada int yang disediakan? Menyimpan nilai ketika Anda tidak memiliki nilai berarti Anda harus melacak seluruh jajaran nilai yang tidak ada. Setidaknya satu untuk setiap tipe data (mungkin lebih banyak ketika Anda mendapatkan kasus di mana -1 adalah nilai aktual sehingga Anda perlu memiliki beberapa alternatif dll). Jika Anda perlu / ingin melakukan sesuatu yang "fudgy" pada tingkat aplikasi itu adalah satu hal tetapi mereka tidak perlu mencemari data Anda.
sumber
Sayangnya, Oracle bingung dengan representasi string VARCHAR dengan panjang nol dengan representasi NULL. Keduanya diwakili secara internal oleh satu byte dengan nilai nol. Ini membuat diskusi menjadi lebih sulit.
Banyak kebingungan seputar pusat-pusat NULL di sekitar logika bernilai tiga . Pertimbangkan kodesemu berikut:
Anda tidak akan mengharapkan pesan ketiga, tetapi itulah yang akan Anda dapatkan, di bawah tiga logika yang dihargai. Tiga logika yang dihargai mengarahkan orang ke banyak bug.
Sumber kebingungan lainnya adalah menarik kesimpulan dari tidak adanya data, seperti menarik kesimpulan dari anjing yang tidak menggonggong di malam hari. Seringkali kesimpulan ini bukan yang dimaksudkan oleh penulis dari NULL.
Karena itu, ada banyak situasi di mana NULL menangani tidak adanya data dengan baik, dan menghasilkan persis hasil yang Anda inginkan. Salah satu contoh adalah kunci asing dalam hubungan opsional. Jika Anda menggunakan NULL untuk menunjukkan tidak ada hubungan dalam baris yang diberikan, baris itu akan keluar dari gabungan dalam, seperti yang Anda harapkan.
Perlu diketahui juga bahwa meskipun Anda menghindari NULLS sepenuhnya dalam data yang disimpan (bentuk normal keenam), jika Anda melakukan penggabungan luar, Anda masih harus mengatasi NULLS.
sumber
Gunakan Null.
Tidak ada gunanya menyimpan nilai '', ketika hanya membuat bidang dalam tabel nullable akan dilakukan. Itu membuat pertanyaan lebih jelas juga.
Query SQL manakah yang lebih jelas dan dapat dibaca jika Anda ingin menemukan pengguna dengan alamat email?
SELECT * FROM Users WHERE email_address != ''
SELECT * FROM Users WHERE email_address IS NOT NULL
SELECT * FROM Users WHERE email_address != '' and email_address IS NOT NULL
Saya akan mengatakan 2 adalah. Meskipun 3 lebih kuat dalam kasus di mana ada data buruk disimpan.
Untuk kasus alamat email pada formulir, yang merupakan opsional, itu harus tercermin dalam tabel juga. Dalam SQL, ini adalah bidang nullable, yang artinya tidak diketahui.
Saya tidak bisa memikirkan nilai bisnis yang masuk akal dalam menyimpan string kosong di tabel selain dari desain yang buruk. Ini seperti menyimpan nilai string 'NULL' atau 'BLANK', dan membuat pengembang menganggap bahwa itu null atau string kosong. Bagi saya, itu desain yang buruk. Mengapa menyimpannya ketika ada NULL ??
Cukup gunakan NULL, dan Anda akan membuat semua orang sedikit lebih bahagia.
INFO LEBIH LANJUT:
SQL menggunakan sistem logika tiga nilai: Benar, Salah, dan Tidak Dikenal.
Untuk penjelasan yang lebih baik dan lebih detail, saya sarankan pengembang untuk membaca: SQL Queries - di luar TRUE dan FALSE .
sumber
untuk pertanyaan teknis spesifik, masalahnya bukan null vs string kosong, ini adalah kegagalan validasi . String kosong bukan alamat email yang valid!
untuk pertanyaan filosofis, jawabannya serupa: validasi input Anda. Jika string kosong adalah nilai yang valid untuk bidang yang dimaksud, maka harapkan dan berikan kode untuknya; jika tidak, gunakan null.
String kosong akan menjadi input yang valid untuk menjawab pertanyaan: Apa yang dikatakan oleh pantomim kepada jerapah?
sumber
Saya bisa memikirkan alasan memiliki NULL dan string kosong:
[email protected]
NULL
Empty String.
Namun saya tidak akan merekomendasikan itu dan menggunakan bidang yang terpisah untuk apakah akan bertanya apakah Anda tahu tidak ada.
sumber
Pertanyaan seperti yang saya pahami, adalah interpretasi NULL dan string kosong mana yang harus dipilih. Ini tergantung pada berapa banyak negara bagian bidang yang bisa dimasukkan.
Interpretasi tergantung pada bagaimana database diakses. Jika ada lapisan dalam kode yang mengabstraksi database sepenuhnya, daripada memilih kebijakan apa pun (termasuk dua-coulmn) yang berfungsi benar-benar dapat diterima. (Namun, jelas mendokumentasikan kebijakan itu penting). Namun, jika database sedang diakses di beberapa tempat, maka Anda harus menggunakan skema yang sangat sederhana, karena kode akan lebih sulit untuk dipelihara dan mungkin keliru dalam hal ini.
sumber
Yah pada dasarnya pada level logis tidak ada perbedaan antara nilai "tidak valid" dan "tidak ada input pengguna", mereka hanya semua "kasus khusus" sebagian besar waktu. Kasus kesalahan.
Memiliki null membutuhkan ruang tambahan: ceil (kolom_with_null / 8) dalam byte / per baris.
Sel kosong dan nol keduanya adalah cara untuk menandai ada sesuatu yang salah / harus default. Mengapa Anda membutuhkan 2 status "salah"? Mengapa menggunakan NULLs jika mereka mengambil ruang tambahan dan berarti persis sama dengan string kosong? Itu hanya akan menimbulkan kebingungan dan redundansi ketika Anda memiliki dua hal yang artinya (itu bisa berarti) persis sama, mudah untuk melupakan bahwa Anda harus menggunakan NULLs daripada string kosong (jika misalnya pengguna mengabaikan beberapa bidang).
Dan data Anda bisa berantakan. Di dunia yang sempurna Anda akan mengatakan "data akan selalu benar dan saya akan mengingat" ... tetapi ketika orang harus bekerja dalam tim dan tidak semua orang tepat pada level Anda, tidak jarang untuk melihat DIMANA (aa. xx <> '' DAN bb.zz BUKAN NULL)
Jadi alih-alih mengoreksi anggota tim saya setiap hari saya hanya menegakkan aturan sederhana. Tidak ada nilai nol, TIDAK PERNAH!
Menghitung nilai NON-NULL lebih cepat ... pertanyaan sederhana adalah apa yang perlu Anda lakukan untuk itu?
sumber
VARCHAR
kolom akan membutuhkan setidaknya 1 byte untuk menyimpan panjang string, bahkan jika itu nol.Saya cenderung melihatnya bukan dari perspektif DB tetapi dari perspektif program. Saya tahu bahwa pertanyaan ini adalah untuk klik SQL tetapi sungguh, berapa banyak pengguna yang mengakses data secara langsung lebih lama?
Dalam sebuah program saya tidak suka null / nothing. Ada beberapa pengecualian tetapi hanya itu saja. Dan pengecualian itu benar-benar implementasi yang buruk.
Jadi, jika pengguna tidak memasukkan email itu, harus ada sesuatu yang menentukan apakah ini valid atau tidak. Jika email kosong baik-baik saja maka itu akan menampilkan string kosong. Jika pengguna tidak memasukkan email dan itu melanggar aturan, objek harus menunjukkan ini.
Gagasan nol memiliki makna adalah sekolah lama dan merupakan sesuatu yang harus diprogram oleh programmer modern.
Bahkan dalam desain DB mengapa bidang email tidak dapat mengizinkan nol dan memiliki string panjang nol dan memiliki bidang lain yang menunjukkan jika pengguna memasukkan sesuatu? Apakah sedikit banyak yang meminta DBMS? Menurut saya, DB seharusnya tidak menangani logika bisnis maupun logika tampilan. Itu tidak dibangun untuk itu dan dengan demikian melakukan pekerjaan yang sangat buruk untuk menanganinya.
sumber
Saya tidak berpikir itu penting, tapi saya lebih suka kalau NULL ada di sana.
Ketika saya melihat data yang ditampilkan dalam tabel (seperti di SQL Server Management Studio), saya bisa lebih baik membedakan nilai yang hilang jika ia mengatakan NULL dan latar belakang berwarna berbeda.
Jika saya melihat ruang kosong, saya selalu bertanya-tanya apakah itu benar-benar kosong atau ada beberapa spasi putih atau beberapa karakter yang tidak terlihat. Dengan NULL dijamin kosong pada pandangan pertama.
Saya biasanya tidak membedakan nilai-nilai dalam aplikasi, karena itu tak terduga dan aneh bahwa NULL dan string kosong akan berarti sesuatu yang berbeda. Dan sebagian besar waktu, saya mengambil pendekatan defensif dan hanya berurusan dengan kedua negara. Tapi bagi saya sebagai manusia, NULL lebih mudah diproses saat melihat data.
sumber