Bu tabloya bir sayı eklediğimde baştaki sıfırları nasıl koruyabilirim? [kapalı]


10

Bir tabloya iki kayıt ekledim.

create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num

Onları sorguladığımda, hepsi olarak görüntülenir 23. Bu, SQL Server'ın önde gelen 0'ları yok saydığı anlamına gelir. Bunun arkasındaki mekanizma nedir? SQL Server'ın değerleri eklediğim gibi döndürmesini nasıl sağlayabilirim (yani 0023ve 23)?


2
Önde gelen sıfırları neden önemsiyorsun? Sisteminiz için anlamlıysa id, tip VARCHARveya benzeri olmalıdır.
Nick Chammas

Tam olarak 0023'ün veritabanında 23 veya 023 veya 0000000023'ten farklı bir şey olarak kodlanmasını nasıl beklersiniz? Hepsi aynı NUMBER'i ​​temsil ediyor. Ve int bir NUMBER veri türüdür. Sunucunun "önde gelen ondalık sıfır sayısı" değerini depolaması için yer yok.
ErikE

Bu zayıf bir sorudur ve programlama sınıfına herhangi bir girişte ele alınacaktır. Bir int, ints'ın doğası nedeniyle asla sıfırları depolayamaz. Bu, herhangi bir sayıda web kaynağına bakarak çözülebilir. Bunun için veritabanı yöneticisi girilmesi gerekmez.
jcolebrand

1
Baştaki sıfırlar ifade edilir. Bunun yerine, bir dize kullanmanın yanı sıra, belirli sayıda önde gelen sıfıra ihtiyacınız varsa, bu, int sütununda depolananın ötesinde ek bilgilerdir. Bir seçenek bir dize sütunu kullanıyor, ancak başka bir seçenek, önde gelen sıfır sayısını başka bir sütunda veya kullanıcı arayüzünde depolamaktır. örneğin, kullanıcı arabirimi sıfır önde olmak üzere her zaman 4 basamağa biçimlendiriyorsa, bu bilgileri kullanıcı arayüzünde depolamış olursunuz. Değişmek ve her kayıt için korunmak üzere sıfırların # sayısına ihtiyacınız varsa, bunun yerine bu bilgileri ayrı bir alanda saklayabilirsiniz.
Dave Cousineau

Yanıtlar:


27

0023bir sayı değil. Bu bir ip. 23sayıdır. SQL Server, sayıyı tanımlamak için bu ekstra sıfırların gerekli olmadığını tanıyabilir, bu nedenle onları yok sayar. Uygulamaya 0023 olarak bir değer vermek istiyorsanız, uygulama tarafında biçimlendirme yapmanızı öneririm. Bu şekilde, ekleme, toplama veya diğer hesaplamaları yapmak istiyorsanız SQL Server'da depolanan sayı hala bir sayıdır. Gerçekten ' 0023' olarak saklamanız gerekiyorsa, onu bir karakter alanına dönüştürmeniz gerekir; char, varchar, nvarchar, nchar.


0023 dizgiyse, değeri int formatı olarak tanımladığım tabloya nasıl ekleyebilirim?
user8365 15:12

@ user8365 - ya tanımlamak idolarak VARCHARveya 23 yerine 0023 sokma
Lamak

5
@ user8365 - SQL Server'ın bu alanın etki alanı bütünlüğünü ihlal edip edemeyeceğini soruyorsunuz . Yapamazsın. Eğer 0023bir dize sonra bir dize olarak saklayın. Değilse, INT olarak saklayın ve baştaki sıfırları unutun.
Nick Chammas

Tam olarak @NickChammas ne dedi. Burada başka seçeneğin yok. 23 bir sayıdır, 0023 bir dizedir. Bir sayı istiyorsanız, sayı olarak kabul edin. Cevabımın dediği gibi, bir sayı gibi sıralanması, bir sayı gibi toplama, çıkarma, çarpma, bölme vb. Gerekiyorsa, bir sayı olması gerekir. Seçenek yok. Tartışma yok. Baştaki sıfırlar sadece biçimlendirmedir. Bunu uygulama kodunda veya bir yerde yapın.
Grant Fritchey

@ Baştaki sıfırların yalnızca biçimlendirme olduğunu kabul edemiyorum. Herhangi bir sayı sisteminde meşrudurlar; bununla birlikte, 0023b10 = 23b10; bu nedenle, herhangi bir depolama sistemi, tüm önde gelen sıfırları kodlamadan bir miktar sıkıştırma kazanır. Yani, temelde bizim sorgucumuz yanlış soruyu soruyor. 0023 neden bir tamsayı değil? Bu bir tamsayı! Sadece onu temsil etmek için önde gelen sayıların sonsuzluğunu kodlamamız gerekmez.
Ooutwire

5

Diğer cevaplarda 00023bir sayı olduğu zaten söylenmişti ; Sadece bu sayıyı özel biçim kullanarak göstermek için hesaplanmış sütunları kullanabileceğinizi eklemek istiyorum. Örneğin,

create table num_table(id int not null primary key identity(1,1),
num int, leading_zeros smallint,
constraint chk_leading_zero_nonnegative check (leading_zero>=0),
num_formatted as replicate('0',coalesce(leading_zeros,0)) +cast(num as varchar(10)));
insert into num_table(num,leading_zeros) values(23,2) ;
select num_formatted from num_table; -- output '0023'

İyi bir nokta, kesinlikle kayda değer.
Grant Fritchey

0

0023 bir sayıdır, ancak int ve diğer sayı veri türleri sıfırları depolamaz, çünkü bunu yapmak için matematiksel bir neden yoktur.

Baştaki sıfırları depolamanız gerekiyorsa, char, varchar vb. Gibi bir dize veri türü kullanın


1
INTSabit uzunlukta (32 bit gibi) olduğunu ve bunları depolamak için ikili gösterimin kullanıldığını varsayarsak, önde gelen sıfırlar gerçekten saklanır. Ancak çıktıda görüntülenmezler.
ypercubeᵀᴹ

@ypercube - Doğru, ancak önde gelen sıfır sayısı 32 biti doldurmak için gerekli olan şeydir (kullanıcı tarafından tanımlanamaz).
Nick Chammas

@Nick: Evet, tartışma yok. Bence baştaki sıfırların depolanıp depolanmadığı DEĞİLDİR. Aynı sayının iki sürümünün, biri sıfır diğeri baş sıfır olmadan veri türünde depolanıp depolanamayacağıdır.
ypercubeᵀᴹ

Ama bu hiç mantıklı değil. İki ondalık baştaki sıfırın, 32 bit tamsayıdaki baştaki sıfırlarla kesinlikle bir ilişkisi yoktur. Ondalık sayıyı göz önünde bulundurun - bu 15, onaltılı olarak yalnızca bir basamak alır F. Zaten farklı sayıda "önde gelen sıfırları" var. 2147483647 10 basamaklıdır, ancak hex'de yalnızca 7FFFFFFF veya 8 basamaktır.
ErikE

Temel olarak, kullandığımız matematiksel sayı sistemini düşünmeliyiz ... bu durumda ondalık (taban 10). 23, ondalık bir sayıdır; 0x1000 + 0x100 + 2x10 + 3 = 23'tür. Sekizli'de 2X8 + 3 vb. Bu nedenle, depolama motoruna söylemek için, "iki önde gelen sıfırlı 23 numaralı depo" yararlı değildir, çünkü yalnızca aynı nihai sonucu kodlar, yani 23'tür. SQL Server sıfırlarınızı yok saymaz, yalnızca ondalık bir değer döndürür eklediğiniz sayıya eşittir, yani 0023 veya 23
ooutwire 0
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.