Bu konunun biraz tartışmalı olduğunu biliyorum ve internette dolaşan birçok makale / görüş var. Maalesef çoğu, kişinin NULL ile boş dize arasındaki farkın ne olduğunu bilmediğini varsayıyor. Bu yüzden birleşme / toplanmalarla şaşırtıcı sonuçlar hakkında hikayeler anlatıyorlar ve genellikle biraz daha gelişmiş SQL dersleri veriyorlar. Bunu yaparak, tüm noktayı kesinlikle özlüyorlar ve bu yüzden benim için yararsızlar. Bu yüzden umarım bu soru ve tüm cevaplar konuyu biraz ileri götürecek.
Sanırım sütunlardan birinin varchar tipinde bir e-posta adresi olduğu kişisel bilgileri içeren bir masa (isim, doğum, vb.) Var. Bazı nedenlerden dolayı bazı kişilerin bir e-posta adresi vermek istemeyebileceğini varsayıyoruz. Bu tür verileri (e-posta olmadan) tabloya eklerken, iki seçenek vardır: hücreyi NULL olarak ayarlayın veya boş dizgeye ('') ayarlayın. Bir çözümden başka birini seçmenin tüm teknik etkilerinin farkında olduğumu ve her iki senaryoda da doğru SQL sorguları oluşturabileceğimi varsayalım. Sorun, her iki değer de teknik seviyede farklılık gösterse de, mantıksal seviyede tamamen aynıdır. NULL'a ve '' ye baktıktan sonra tek bir sonuca geldim: Adamın e-posta adresini bilmiyorum. Ayrıca ne kadar uğraştığım önemli değil. NULL veya boş dize kullanarak bir e-posta gönderemedim, bu yüzden görünen o ki çoğu SMTP sunucusu benim mantığımla aynı fikirde. Bu yüzden değeri bilmediğim ve boş dizgiyi kötü bir şey olarak gördüğümde NULL kullanma eğilimindeyim.
Meslektaşlarımla yapılan yoğun tartışmalardan sonra iki soru ile geldim:
bilinmeyen bir değer için boş dize kullanmanın bir veritabanının gerçekler hakkında "yalan söylemesine" neden olduğunu varsaymakta haklı mıyım? Daha kesin olmak gerekirse: SQL'in neyin değerli olup olmadığı hakkındaki fikrini kullanarak, şu sonuca varabilirim: e-posta adresimiz var, sadece null olmadığını öğrenerek. Ama daha sonra, e-posta göndermeye çalışırken çelişkili sonuca geleceğim: hayır, e-posta adresimiz yok, @! # $ Veritabanı yalan söylemiş olmalı!
Boş bir dizgenin '' önemli bir bilgiyi (değer ve değer hariç) iyi bir taşıyıcı olabileceği, başka bir şekilde (ek sütun gibi) saklamak zahmetli / verimsiz olabilecek mantıklı bir senaryo var mı? Bazen gerçek değerleri ve NULL'larla birlikte boş dize kullanmanın iyi olduğunu iddia eden birçok gönderi gördüm, ancak şimdiye kadar mantıklı olacak bir senaryo görmedim (SQL / DB tasarımı açısından).
Not: Bazı insanlar, sadece kişisel bir zevk meselesi olduğunu yanıtlamaya özendirilecektir. Katılmıyorum Bana göre önemli sonuçları olan bir tasarım kararıdır. Bu nedenle, bu konudaki fikirlerin bir takım mantıksal ve / veya teknik sebeplerle desteklendiği cevapları görmek istiyorum.
''
Oracle'da bile aynı değildir NULL
. Örneğin, bir CHAR(1)
sütunun atanması , değerin ''
sonuçlanmamasına ' '
(yani boşluk) neden olur NULL
. Ayrıca, eğer Jacek Oracle kullanıyorsa, bu soru muhtemelen ortaya çıkmayacaktı :-)
'' IS NULL
değerlendirildiğinden beri bu başka bir WTF true
.