Saya tahu itu memang dianggap sebagai NULL
, tetapi itu tidak banyak membantu saya untuk mengatakan mengapa ini terjadi. Seperti yang saya pahami spesifikasi SQL, '' tidak sama dengan NULL
- satu adalah datum yang valid, dan yang lainnya menunjukkan tidak adanya informasi yang sama.
Jangan ragu untuk berspekulasi, tetapi harap tunjukkan jika itu masalahnya. Jika ada orang dari Oracle yang dapat mengomentarinya, itu akan sangat fantastis!
Jawaban:
Saya percaya jawabannya adalah bahwa Oracle sudah sangat, sangat tua.
Kembali di masa lalu sebelum ada standar SQL, Oracle membuat keputusan desain string kosong di
VARCHAR
/VARCHAR2
kolomNULL
dan bahwa hanya ada satu rasa NULL (ada teori relasional yang akan membedakan antara data yang tidak pernah diminta, data di mana jawabannya ada tetapi tidak diketahui oleh pengguna, data di mana tidak ada jawaban, dll. yang semuanya merupakan pengertianNULL
).Pada saat standar SQL muncul dan menyetujui bahwa
NULL
dan string kosong adalah entitas yang berbeda, sudah ada pengguna Oracle yang memiliki kode yang menganggap keduanya setara. Jadi Oracle pada dasarnya dibiarkan dengan opsi untuk memecahkan kode yang ada, melanggar standar SQL, atau memperkenalkan semacam parameter inisialisasi yang akan mengubah fungsionalitas dari sejumlah besar kueri yang berpotensi. Melanggar standar SQL (IMHO) adalah yang paling tidak mengganggu dari ketiga opsi ini.Oracle telah membuka kemungkinan bahwa
VARCHAR
tipe data akan berubah dalam rilis mendatang untuk mematuhi standar SQL (itulah sebabnya semua orang menggunakanVARCHAR2
Oracle karena perilaku tipe data itu dijamin akan tetap sama di masa mendatang).sumber
Tom Kyte VP dari Oracle:
sumber
''
sedang implisit dikonversi ke VARCHAR2, seperticast('' as char(1)) is null
yang ... mengejutkan BENARSaya menduga ini jauh lebih masuk akal jika Anda memikirkan Oracle seperti yang dilakukan pengembang sebelumnya - sebagai backend yang dimuliakan untuk sistem entri data. Setiap bidang dalam database terkait dengan bidang dalam bentuk yang dilihat oleh operator entri data di layarnya. Jika operator tidak mengetikkan apa pun ke dalam bidang, apakah itu "tanggal lahir" atau "alamat" maka data untuk bidang itu "tidak dikenal". Tidak ada cara bagi operator untuk menunjukkan bahwa alamat seseorang benar-benar string kosong, dan itu tidak masuk akal.
sumber
Dokumentasi Oracle memperingatkan pengembang untuk masalah ini, kembali setidaknya sejauh versi 7.
Oracle memilih untuk mewakili NULLS dengan teknik "nilai yang tidak mungkin". Misalnya, NULL di lokasi numerik akan disimpan sebagai "minus nol", nilai yang tidak mungkin. Setiap nol nol yang dihasilkan dari perhitungan akan dikonversi menjadi positif nol sebelum disimpan.
Oracle juga memilih, secara keliru, untuk mempertimbangkan string VARCHAR dengan panjang nol (string kosong) sebagai nilai yang tidak mungkin, dan pilihan yang cocok untuk mewakili NULL. Ternyata string kosong jauh dari nilai yang tidak mungkin. Ini bahkan identitas di bawah operasi penggabungan string!
Dokumentasi Oracle memperingatkan para perancang dan pengembang basis data bahwa beberapa versi Oracle di masa depan mungkin memutuskan hubungan ini antara string kosong dan NULL, dan memecah kode apa pun yang bergantung pada asosiasi itu.
Ada teknik untuk menandai NULLS selain dari nilai yang tidak mungkin, tetapi Oracle tidak menggunakannya.
(Saya menggunakan kata "lokasi" di atas berarti persimpangan dari suatu baris dan kolom.)
sumber
String kosong sama dengan NULL hanya karena itu "kejahatan kurang" jika dibandingkan dengan situasi ketika keduanya (string kosong dan nol) tidak sama.
Dalam bahasa di mana NULL dan String kosong tidak sama, kita harus selalu memeriksa kedua kondisi.
sumber
not null
kendala pada kolom Anda dan periksa hanya pada string kosong.WHERE Field <> ''
mengembalikan true hanya jika bidang tidak NULL dan tidak kosong, pada database dengan perilaku ANSI untuk string kosong.Menurut dokumen resmi 11g
Kemungkinan alasannya
val IS NOT NULL
lebih mudah dibaca daripadaval != ''
val != '' and val IS NOT NULL
sumber
val <> ''
sudah dikecualikanNULL
. Mungkin maksudmuval = '' OR val IS NULL
. Tetapi string kosong yang tidak bisa dibandingkan dengan NULL berguna !Contoh dari buku
sumber
Karena tidak memperlakukannya sebagai NULL juga tidak membantu.
Jika Anda membuat kesalahan dalam bidang ini pada Oracle, Anda biasanya langsung menyadarinya. Namun, dalam SQL server, itu akan berfungsi, dan masalahnya hanya muncul ketika seseorang memasukkan string kosong daripada NULL (mungkin dari pustaka klien .net, di mana null berbeda dari "", tetapi Anda biasanya memperlakukannya sama ).
Saya tidak mengatakan Oracle benar, tetapi menurut saya kedua cara tersebut kira-kira sama buruknya.
sumber
Memang, saya tidak punya apa-apa selain kesulitan dalam berurusan dengan Oracle, termasuk nilai datetime yang tidak valid (tidak dapat dicetak, dikonversi atau apa pun, hanya melihat dengan fungsi DUMP ()) yang diizinkan untuk dimasukkan ke dalam database, tampaknya melalui beberapa buggy versi klien sebagai kolom biner! Begitu banyak untuk melindungi integritas basis data!
Oracle menangani tautan NULLs:
http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/
http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html
sumber
Pertama-tama, string null dan null tidak selalu diperlakukan sama oleh Oracle. String nol adalah, secara definisi, string yang tidak mengandung karakter. Ini sama sekali tidak sama dengan nol. NULL, menurut definisi, tidak adanya data.
Lima atau enam tahun yang lalu, string nol diperlakukan berbeda dari null oleh Oracle. Sementara, seperti null, null string sama dengan segalanya dan berbeda dari segalanya (yang menurut saya baik-baik saja untuk null, tetapi benar-benar SALAH untuk string nol), setidaknya panjang (string nol) akan mengembalikan 0, sebagaimana seharusnya karena string nol adalah string dengan panjang nol.
Saat ini di Oracle, length (null) mengembalikan null yang saya kira OK, tetapi length (null string) juga mengembalikan null yang benar-benar SALAH.
Saya tidak mengerti mengapa mereka memutuskan untuk mulai memperlakukan 2 nilai "yang berbeda" ini sama. Mereka berarti hal yang berbeda dan programmer harus memiliki kemampuan untuk bertindak pada masing-masing dengan cara yang berbeda. Fakta bahwa mereka telah mengubah metodologi mereka mengatakan kepada saya bahwa mereka benar-benar tidak memiliki petunjuk tentang bagaimana nilai-nilai ini harus diperlakukan.
sumber
VARCHAR
bidang dapat memiliki nilai (nol atau lebih karakter) atau tidak ada nilai (NULL), berhenti penuh.NULL
dan string bernilai nol, dan perbedaan seperti itu tidak masuk akal. Saya khawatir jawaban ini adalah fantasi lengkap.