En iyi veritabanı platformlarında neden imzasız tamsayı türleri yok?


15

Veritabanları genellikle çeşitli veri türleri ve özel uzunluklarla çok özelleştirilebilir.

unsigned intPostgreSQL ve MS SQL Server'da bulunmayan türlerini kullanmak için sözdizimi aramaya çalıştığımda beni şaşırtıyor . MySQL ve Oracle gibi görünüyor.

Bu, kendi adına göze çarpan bir ihmal gibi görünüyor - bir sonraki en iyi parfüm seçeneği uzun / bigint (8 bayt tam sayı) olmakla birlikte, tamamen gereksiz olabilir! Herkes neden yerel imzasız int desteği içermemeyi seçeceklerini biliyor mu?


2
Taşınabilir == standart zorunlu. C standardı, normal veri veya uzunluğun genişliğini belirtmez, sadece temsil edilebilir sayıların minimum aralığını belirtir. Bir noktada 16bit int olan platformlar yaygındı. 64bit mümkündür. 36 da (soyu tükenmiş olsa da). 24 olur (DSP). Ne kadar sıklıkta 32 bit'e uyuyor ancak 31'e uymuyor ve sıradan sayısal türler kullanmanın size bir performans artışı verdiğini ölçtünüz?
Mat

2
Hem SQL-Server hem de Postgres, NUMERIC(10)tamsayılara 9.999.999.999(ve bir kısıtlamayla negatif değerlere izin
vermeyebilirsiniz

4
Bir nedenden dolayı: SQL standardında belirtilmezler. Postgres ile ilgili daha uzun bir tartışma için şu tartışmaya göz atın: postgresql.1045698.n5.nabble.com/… ve bu: postgresql.1045698.n5.nabble.com/…
a_horse_with_no_name

2
SQL Server için bir açıklama burada
Martin Smith

1
@Mat Endişelendiğim performans hit değil, 4 ekstra bayt x 153 milyon = ~ 612 ekstra MB israfı, değerler 3 milyarın üzerine çıkıyor, ancak 4 milyar değil. Bir sayısal (10), 9 bayt depolama alanı
gerekliliğinin

Yanıtlar:


14

Microsoft Jim Hogg bu soruna aşağıdakilerle yanıt verdi:

Artıları ve eksileri vardır. Pro tarafında, bazı hataları önlemek için iyi bir yol gibi görünüyor - bir (imzalı) int kontrol etmek zorunda> 0 değerine sahip. Ve ben de aslında int birçok kullanımı aslında asla negatif olmamalı sayımları ile ilgili girişim . Maksimum satır sayısını iki katına çıkarma konusunda mı? - doğru, ama bunun daha az çekici olduğunu söyleyebilirim.

Eksileri tarafında ... C veya C ++ ile imzalı / imzasız türleri karıştırmak yeterince basit olmalı gibi görünüyor. Değil. Bulunması zor hataların küçük bir tarpitini açar - çoğunlukla örtülü tanıtımlar / genişletmeler için karmaşık kurallar nedeniyle. SQL, ne yazık ki, döküm kuralları zaten daha karmaşık bir dizi etkisi vardır. İmzasız ints eklemek, korkarım, hepimizi daha da karıştırır.

Bu öneriyi kitaplarda saklayacağım. Ancak, ekleyebileceğimiz / ekleyebileceğimiz tüm özellikler arasında, bu, saygıyla, listenin en üstünde değil.

Kaynak: Microsoft Connect

Pro listeye önemli ölçüde ekleyeceğim ve SQL motorlarının zaten bundan daha karmaşık şeyler yaptığını tekrar ediyorum ve böylece ekipleri ek karmaşıklığı işleyebilir. Toplamlarını kabul etmeme rağmen, SQL Server imzasız türleri desteklememesinin nedeni budur .

Connect bağlantısı aslen soru yorumlarında Martin Smith tarafından yayınlanmıştır .


3
"hepimizi daha da karıştırın" - muhtemelen sadece kendi geliştirme ekibini değil, SQL Server kullanan herkesi ifade eder.
Oskar Berggren
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.