Bir kişinin adı Boş ise, veritabanını nasıl bozar?


55

Bu makaleyi BBC'de okuyordum . Jenifer Null adında bir kişinin öyküsünü ve uçak bileti rezervasyonu, internet bankacılığı vb. Gibi online veritabanlarını kullanırken günlük problemlerle nasıl karşılaştığını anlatıyor.

Veritabanlarında iyi bilgili değilim ve çok sık kullanmıyorum. Öğrenmek için bir web sitesi yaptığımda, sunucu tarafı form onayı düzenli ifadeler kullandı. Hatırladığım kadarıyla "Null" adını memnuniyetle kabul ederdi. Yine de denemedim.

Birisi bu durumun ortaya çıkması durumunda teknikleri açıklayabilir mi? Form doğrulaması sadece bir string == NULLşey mi yapıyor ? Yine de sanmıyorum NULL is same as "NULL".


32
Makale açıkça bir gazeteci tarafından yazılmış. Boşluklar birçok karışıklığın nedenidir, bir gazetecinin daha az kafasını karıştırmasını beklemezsiniz.
ypercubeᵀᴹ

2
Herkes: bağlantılar ile Comments ilgili soru veya makalelerin edilmiş bir taşındı Topluluk Wiki cevap aşağıda. Bu sayfaya daha fazla bağlantı eklemek yerine, lütfen bu cevabı düzenleyin (veya bir düzenleme önerin).
Paul White

Yanıtlar:


42

'Null' ifadesini null sütunları için döndüren veritabanı arayüzlerini (örneğin, çerçeve kütüphaneleri) gördüm. Bunu hata ayıklama için açıp kapatacak bir bayrak olduğuna inanıyorum. Bu bayrak, geliştiricilerin boş alanın boş bir değer veya boş bir değer sonucu olup olmadığını kolayca belirlemesini sağlar. Bu, özellikle üretimde kötü bir ayardır ve makalede açıklanan konuları açıklar.

'Null' öğesinin null değerine dönüştürülmesinin tersine işlenmesi, ad alanı için bir uygulama hatası oluşturmalıdır. Bunun oldukça hızlı bir şekilde çözülmesini bekliyorum.


Aslında - bu, tüm verilerin bir dizgeye dönüştürüldüğü yazılmamış dillerin çerçevelerinde oldukça yaygındır. Üzerinde çalıştığımdan bu yana birkaç yıl geçti, ama örneğin ColdFusion'ın ilk sürümlerinde bu problemin olduğuna inanıyorum.
Jules

25

Kafanızdaki karmaşanın büyük bir kısmının gazeteciden kaynaklanması iyi bir şans. Makale, sadece veritabanlarını değil, tüm uygulama sistemlerini kullanan problemleri anlatıyor. Tamamen makul, çünkü bu kitlesel tüketime yönelik bir yazı, ancak teknik detaylar yazar tarafından anlaşılıyor veya yanlış anlaşılıyor.

Muhtemelen bu sorunların bir kısmı DB'nin API'sından ziyade uygulama katmanında ortaya çıkmaktadır. Büyü değerleri, endüstrinin dışına itilmesi saçma zor bir anti-kalıptır. Çok kolay bir şekilde bazı programcılar “biri 'boş' yazmış biri?? Değeri olmadığı anlamına gelmeliydiler, çünkü bu boş demektir!” SQL enjeksiyonunu engellemedeki yanlış yönlendirilmiş bir girişim aynı zamanda Null'un kötü muamelesinden veya standart bir SQL string sınırlayıcısı olan tek bir alıntı içeren Hawaii soyadından da sorumlu olabilir.

Bu değerleri yanlış NULL veya boş bir dizgiye dönüştüren bir uygulama, işletme mantığı veya DB kısıtlamaları farklı bir şey beklerse kolayca hata oluşturabilir. Bu, doğal olarak, makalede açıklanan sinir bozucu kullanıcı deneyimine yol açar.


5
O'Brian'ın Hawaii olduğunu bilmiyordum.
glglgl

19

Makalenin kendisi , sorunu gösteren bir Yığın Taşması sorusuna bir bağlantı içerir ; kodun kullanıldığı bir Flex uygulamasındaydı:

currentChild.appendChild("Fred");

sözcüğü içeren bir öğeyi Fredbir XML belgesine ekler, ancak kodu

currentChild.appendChild("null");

"null" metnini içeren bir öğe değil, boş bir öğe eklerdi.

XML, haddi zatında, bir sorunu yok metin hiçbir sorun olacağını böyle metinler gibi değer "Boş". Aslında, NULLXML'de hiç özel bir anlamı yoktur.


13

Bahsettiğimi sanmadığım bir şey var: Biz sadece SQL hakkında konuşmuyoruz.

İsim veritabanında başlayabilir / bitebilir ... ancak normalde oraya ulaşmak için MULTIPLE kanallarını içerir. Veritabanı, Sql, php, html, javascript ... Java, C #, VB, Perl, Phython, Ruby, bash, toplu, vb, vb ...

Boru hattındaki bu adımların her biri, verileri bir formattan diğerine dönüştürmeyi içerebilir. Sql tablolarından, json, xml, CSV, vb ...

Bu karmaşık zincirin herhangi bir noktasında, kötü programlama veya bulanık bir programlama dilinin sadece bir noktasını alacaktır ( örneğin Javascript null işleme ).

Bu yüzden kendinizi veritabanındaki problemle sınırlamayın ... çünkü "yığının" herhangi bir yerinde olabilir.



4

İlişkisel veritabanlarının eksik veya ilgisiz değerleri içermesi gerekir. Örneğin, müşteri listesinde bir cep telefonu numarası veya cinsiyet bulunabilir. Bir şirket müşteri olmak isterse - hangi cinsiyete sahip olmalıdır?

Bir değerin eksik olduğunu göstermek için özel bir gösterge kullanılır. Bu özel bayrak NULL. Bu yüzden özensiz programlama, eksik değer göstergesine neden olabilir - NULL - belki de soyadını gerçek bir değerden ziyade eksik veri olarak yorumlayarak Jennifer Null'ın soyadıyla karıştırılmalıdır.

Bir banka hesabı açmak gibi ama para yatırmamak gibi bir şey. Bakiye sıfır. Bu, bakiyenizin olmadığı anlamına gelmez. Bir bakiyeniz olduğu ve değeri "0" olduğu anlamına gelir. Ancak özensiz programlama, sıfırı "yok" olarak yanlış yorumlayabilir ve bir hesabınızın olmadığını belirleyebilir.


2

Null adında biriyle garip davranacak pek çok kötü yazılı yazılım ve hatta çerçeve var.

Ama insan unsurunu unutmayalım: belki insanlar adını ekranlarda ve çıktılarda gören ve bunun bir hata olduğunu düşünen ve bir insanı silmek başka bir olası neden mi?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.