Null soyadı birçok veritabanında nasıl sorun yaratır?


71

BBC hakkında bir makale okudum . Söyledikleri örneklerden biri, 'Null' soyadı olan kişilerin, bazı web sitelerinde ayrıntılarını girmekte sorun yaşadıklarıydı.

Karşılaştıkları hata hakkında bir açıklama yapılmamıştır.

Ama bildiğim kadarıyla 'Null' stringi ve asıl Null değeri tamamen farklı (veritabanı açısından).

Bu neden bir veritabanında sorunlara neden olur?


2
Bu BBC makalede alıntı kişiden biri tarafından yazılmış programcılar adlarıyla ilgili yaptığımız varsayımlar hakkında biraz ünlü blog makalesinde olduğu kalzumeus.com/2010/06/17/...
Jörg W Mittag



4
Bu adamı televizyonda ilk gördüğümde bunun bir veritabanı hatası olduğunu varsaydım. Sonra aslında onun adı olduğunu öğrendim.
Nate Eldredge

3
@JarrodRoberson "Jennifer Null" un karşılaştığı sorunların açıklaması ve OP’nin yayınladığı linkte benzer şekilde verilen "bütün öncülün yanlış olduğunu" nasıl söylersin? Gerçek son kullanıcıların karşılaştığı gerçek bir konudur.
Steven Burnap

Yanıtlar:


102

Veritabanı sorunlarına neden olmaz. Geliştiriciler tarafından yazılan ve veritabanlarını anlamayan uygulamalarda sorunlara neden olur. Sorunun temelinde veritabanı ile ilgili çok fazla sayıda yazılım dizge olarak bir NULL kaydı görüntülüyor NULL. Bir uygulama daha sonra NULL kaydının dize formuna dayandığında (muhtemelen büyük / küçük harf duyarlı karşılaştırma işlemlerini kullanarak da), o zaman böyle bir uygulama "null"NULL olarak herhangi bir dize olarak değerlendirilecektir. Sonuç olarak, Null adının bu uygulama tarafından bulunmadığı kabul edilir.

Çözüm, NOT NULLveritabanında olduğu gibi boş olmayan sütunları bildirmek ve veritabanı kayıtlarına dize işlemleri uygulamamaktır. Çoğu dilde dize düzeyinde arayüzleri gereksiz kılan mükemmel veritabanı API'leri vardır. SQL enjeksiyonu gibi diğer hataları daha az olası kıldığından, daima tercih edilmeleri gerekir.


30
Ancak bu durumda, söz konusu makaleyi okursanız, bir soyadı alanı yazmak NOT NULLdiğer insanlar için bir takım sorunlara neden olacaktır. "Bazı bireylerin yalnızca bir adı vardır, bir ad ve soyad değil."
MikeTheLiar

41
@Darkhogg pek çok insan bu konuda benimle aynı fikirde değil, ancak isimlerin e-posta adresleri gibi olduğunu düşünüyorum - onları doğrulamaktan çekinmeyin, kullanıcıya tek bir metin kutusu verin ve ne isterlerse koymalarını sağlayın. Bu, gerçekten ihtiyacım olursa , sizden doğru olacağı kesin bir şekilde sizden alacağıma dair bilgiler.
MikeTheLiar

8
@mikeTheLiar Bunun ismini bilmiyorum ama veriler üzerinde aşırı kısıtlayıcı kurallar oluşturmanın sonucu olarak ortaya çıkan bir sürü hata var. Genellikle, uygulamalarda ve veritabanlarında sayısal olarak tanımlanmış posta kodlarını ve telefon numaralarını görürsünüz. Gerçekten sayı değiller çünkü onlara matematiksel işlem yapmak hiç mantıklı değil. Bu yüzden birisi Kanadalı bir adres girmeye çalıştığında sıkışıp kalıyorlar.
JimmyJames

19
@JimmyJames evet, sayısal olarak depolanan posta kodları ve aniden burada yaşayan herhangi birinin 8 temelli posta kodu var. “Bununla matematik yapmıyorsanız, bu bir dize, Tam Dur.”
MikeTheLiar

8
@mikeTheLiar. Adları tek bir dize olarak kabul etmedeki sorun (genellikle tercih edilir, katılıyorum), soyadına göre alfabetik olarak sıralanması gerekliliğidir.
TRiG

13

Özel sorunuza cevap vermek için bir web formu ve veritabanı arasındaki olaylar zinciri boyunca birçok adım var. Soyadı Nullhatalı bir NULLdeğer olarak yorumlanırsa , sistem tamamen geçerli bir adı geçersiz olarak reddedebilir. Bu, amon tarafından açıklandığı gibi veritabanı katmanında olabilir . Bu arada, bu belirli bir sorun ise, o zaman veritabanı muhtemelen Bobby AKA'nın saldırısı olan AKA SQL enjeksiyonuna da açıktır . Zincirde sorunlara yol açabilecek bir diğer adım seri hale getirme işlemidir .

Genel olarak makale daha büyük bir problemdi. Dünya, varsayımlarımıza her zaman uymayan büyük dağınık bir yer. Bu, özellikle uygulamanızı uluslararasılaştırmaya çalıştığınızda belirgindir. Günün sonunda, uygulamalarımızın verilerimizi doğru şekilde işlemesini ve kodlamasını sağlamamız gerekir . Giderek artan karmaşık vakaları desteklemeye ne kadar kaynak ayırmaya karar vermemiz kararlıdır. Kapsayıcı olmayı tamamen desteklerken, şirketin "resmen Prens olarak bilinen sanatçının" veritabanında ismini göstermek için Unicode karakterini kullanması gerektiğine karar verdiğini anlayacağım.


Bunun, SQL enjeksiyonuna neden olabilecek güvensiz dize enterpolasyonunun neden olduğunu hayal etmek zor. Bir SQL sorgusunda kullanıcı girişi yapmayı unutursanız (örneğin, INSERT INTO users (first, last) VALUES($first, $last)değerlendirir INSERT INTO users (first, last) VALUES(Jennifer, Null)) isimleri geçerli olmayan SQL anahtar kelimeler veya sütun adları olmayan herkes sadece hata atar ve kayıtları da eklenmez. Sebep daha karmaşık olmalı.
Andrew Medico

Saman adamınızdaki @AndrewMedico örneği evet, ancak yanlış şeyler yapmanın birçok yolu vardır. <strike> Aptallık <\ grev> cehaletinin gücünü asla küçümseme. Sonuç olarak, asıl sorunun ne olduğu hakkında hiçbir fikrimiz yok çünkü söz konusu kodu gözden
Erik

7

Veritabanına girmeden önce, bir DOM öğesidir, daha sonra bir javascript değişkeni etrafından geçmiş, doğrulanmış ve manipüle edilmiş, daha sonra bir JSON değeri, daha sonra kullandığınız her bir arka uç JSON kütüphanesinde bir değişken, sonra bir değişken, doğrulanmış ve arka uç programlama dilinizde manipüle edilmiş, daha sonra bir çeşit DAO, sonra da bir SQL dizesinin bir parçası. Sonra değeri geri almak için hepsini tersten yaparsınız. Bu, programcıların hata yapması için çok fazla yer var, ve genellikle statik yazımın yararı olmadan.


2

Büyük olasılıkla bir programlama sorunu. NULL'ların nasıl geçtiğine dair bu cevaba bakarsanız, "Mr. Null" olsaydınız, istenmeyen bazı davranışlara kolayca neden olabilirsiniz.

https://stackoverflow.com/questions/4620391/mysql-and-php-insert-null-rather-than-empty-string

Bazı veri öğelerinin NULL olarak iletilmesi durumunda verilerin veritabanında boş bir veri tabanı olarak enterpolasyon yapacağını görebilirsiniz.

"NULL"! = Veritabanı Null

Bazı durumlarda ve ilgili davranış kullanın ...

Soyadının veritabanında boş değil olarak işaretlendiğini varsayalım, şimdi veriler eklendiğinde NULL olarak yorumlanacak ve ekleme başarısız olacaktır.

Başka bir örnek, soyadının veritabanında geçersiz olduğunu söyleyebiliriz. Bay NULL eklenir ve "NULL" ile aynı olmayan DBNull.Value değerine dönüştürülür. Eklemeden sonra Bay Null'ı bulamıyoruz çünkü soyadı "NULL" değil, gerçekte bir veritabanı null değeri.

Yani, bunlar 2 problem sorunu olur. @Amon'un belirttiği gibi, veritabanlarının kendilerinin null'larla hiçbir sorunu yoktur, ancak biri farklı satıcılar arasında farklılıklar olacağı için her RDMS örneğinde null'ların nasıl kullanıldığını anlamalıdır.


"Bazı veri öğelerinin NULL olarak iletilmesi durumunda verilerin veritabanında boş bir veritabanı olarak enterpolasyon yapacağını görebilirsiniz." - bağlantılı SO soru / kabul-cevap bunu göstermiyor mu?
MrWhite

2

Sorunu özensiz programlama ve bazı SQL uygulamalarının zayıf tasarımı ile ilişkilendiririm. "Null" adı her zaman tırnak işaretleri ile sunulmalı ve yorumlanmalıdır. null, veritabanı değeri, daima tırnak işaretleri olmadan sunulmalıdır; ancak geçici kodu yazarken, "her şeyin yapacağını" paradigması içine koymak kolaydır ve alıntı olmayan bir biçimde olduğuna inanılan şeyleri kabul edin.

Bu, diğer veri türlerinin; örneğin sayılar, yorumun net olmadığı için herhangi bir biçimde olabilir ve kabul edilir.


Elbette, SQL kullanan uygulamaların zayıf uygulamalarını mı kastediyorsunuz ? Bir RDBMS'nin kendisinin ciddi bir şekilde uygulanması bu konuda savunmasız olmayacaktır (ciddi bir uygulama olmadığı sürece!)
underscore_d

0

Temelde bir sorun, "null" teriminin bazen aralarında ayrım yapmak için bağlam kullanarak iki farklı veritabanı kavramının uygulanmasıdır:

  1. Bir şeyin bilinen bir değeri yok
  2. Değerinin olmadığı bir şey bilinmektedir.

Bağlam bazen bu kavramları ayırt etmek için yeterli olsa da, gerçekten olmadığı zamanlar vardır. Örneğin, bir arama sorgusu yapmak için bir kayıt kullanıyorsa, örneğin, "Kimseye göre, soyadı olmayan bir isim istiyorum" ile "ilk adına sahip birini istiyorum" arasında bir fark olmalıdır. her neyse] ama soyadı bilinmiyor. " Birçok veritabanı motorunun bir anlamı ya da diğerine karşı önyargısı vardır, ancak hepsi aynı değildir. Bir veritabanı motorunun tek yönlü çalışmasını bekleyen kod, farklı çalışan farklı bir motorda çalıştırıldığında arızalanabilir.


Bir dizgenin değeri olmadığı biliniyorsa, değer boş bir dize değil, boş bir dize olmalıdır.
Byron Jones

0

Mevcut cevapların çoğu bir uygulamanın SQL olmayan kısımlarına odaklanır, ancak SQL'de de bir sorun olabilir:

Kullanıcının soyadının bulunmadığı yerdeki kayıtları filtrelememiz istendiğinde, SQL'i çok iyi anlamayan biri bir filtre yazabilir WHERE u.lastname != 'NULL'. SQL'in çalışma şekli nedeniyle bu durumun görülüp görülmediğini kontrol eder u.lastname IS NOT NULL: tüm NULLkayıtlar filtrelenir. Tüm NULLkayıt dışı kalır.

Elbette ki kayıtlar dışında u.lastname == 'NULL', ancak test sırasında böyle bir kayıt bulunmamış olabilir.

SQL bu çerçeve olmayan kontrol etmek için kolay ulaşılabilir bir şekilde göstermiyor çerçevenin, bir çeşit tarafından oluşturulan, bu daha olası hale gelir NULLparametrelerle -lık ve ben dizede geçerse kimse, selam" fark NULL, bunu tam olarak istediğimi yapar! "

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.