Bagaimana cara saya menjaga angka nol di depan saat saya memasukkan angka ke dalam tabel ini? [Tutup]

10

Saya telah memasukkan dua catatan ke dalam tabel.

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

Ketika saya meminta mereka, mereka semua ditampilkan sebagai 23. Ini berarti bahwa SQL Server mengabaikan 0s terkemuka. Apa mekanisme di balik itu? Bagaimana saya bisa meminta SQL Server mengembalikan nilai saat saya memasukkannya (yaitu 0023dan 23)?

pengguna8365
sumber
2
Mengapa Anda peduli dengan angka nol di depannya? Jika mereka bermakna bagi sistem Anda, maka idharus bertipe VARCHARatau serupa.
Nick Chammas
Bagaimana tepatnya Anda berharap 0023 dikodekan dalam database sebagai sesuatu yang berbeda dari 23 atau 023 atau 0000000023? Mereka semua mewakili NUMBER yang sama. Dan int adalah tipe data NUMBER. Tidak ada tempat bagi server untuk menyimpan nilai "angka terdepan dari angka nol desimal" ini.
ErikE
Ini adalah pertanyaan yang buruk, dan akan dibahas dalam setiap pengantar untuk kelas pemrograman. Int tidak pernah dapat menyimpan angka nol di depan, karena sifat int. Ini dapat diselesaikan dengan melihat sejumlah sumber daya web. Ini tidak memerlukan input dari administrator database.
jcolebrand
1
Nol pemimpin tersirat. Selain menggunakan string sebagai gantinya, jika Anda membutuhkan angka nol terkemuka tertentu, itu adalah informasi tambahan di luar apa yang disimpan dalam kolom int. Satu opsi menggunakan kolom string, tetapi opsi lain menyimpan jumlah nol terkemuka di kolom lain, atau di UI. jika UI selalu memformat menjadi 4 digit dengan nol di awal, misalnya, maka Anda telah menyimpan informasi ini di UI. Jika Anda perlu # nol untuk bervariasi dan dipertahankan untuk setiap catatan, Anda dapat menyimpan info itu di bidang yang terpisah.
Dave Cousineau

Jawaban:

27

0023bukan angka. Ini sebuah string. 23adalah nomornya. SQL Server dapat mengenali bahwa angka nol tambahan tersebut tidak diperlukan untuk menentukan angka, sehingga mengabaikannya. Jika Anda ingin menghilangkan nilai sebagai 0023 ke aplikasi, saya sarankan melakukan pemformatan di sisi aplikasi. Dengan begitu angka yang tersimpan di SQL Server masih merupakan angka jika Anda ingin melakukan penambahan, agregasi, atau perhitungan lainnya. Jika Anda benar-benar harus menyimpannya sebagai ' 0023', Anda perlu mengubahnya menjadi bidang karakter; char, varchar, nvarchar, nchar.

Berikan Fritchey
sumber
Jika 0023 adalah string, bagaimana saya bisa memasukkan nilai ke dalam tabel yang saya definisikan id sebagai format int?
user8365
@ user8365 - Tetapkan idsebagai VARCHARatau hanya menyisipkan 23 alih-alih 0023
Lamak
5
@ user8365 - Anda bertanya apakah Anda dapat membuat SQL Server melanggar integritas domain bidang itu. Kamu tidak bisa Jika 0023adalah string maka simpan sebagai string. Jika tidak, maka simpan sebagai INT dan lupakan angka nol di depannya.
Nick Chammas
Persis apa yang dikatakan @NickChammas. Anda tidak punya pilihan di sini. 23 adalah angka, 0023 adalah string. Jika Anda ingin nomor, perlakukan sebagai nomor. Seperti jawaban saya katakan, jika perlu mengurutkan seperti angka, tambahkan, kurangi, gandakan, bagi, dll, seperti angka, maka itu harus berupa angka. Tidak ada pilihan. Tidak ada argumen. Angka nol di depan hanya memformat. Lakukan itu di kode aplikasi atau di suatu tempat.
Grant Fritchey
@Grant Saya tidak bisa setuju bahwa nol terkemuka hanya memformat. Mereka sah dalam sistem angka apa pun; namun, 0023b10 = 23b10; jadi, sistem penyimpanan apa pun mendapatkan tingkat kompresi tertentu dengan tidak menyandikan semua nol terkemuka. Jadi, pada dasarnya penanya kita menanyakan pertanyaan yang salah. Mengapa 0023 bukan bilangan bulat? Itu adalah bilangan bulat! Kami hanya tidak perlu mengkodekan angka tak terhingga dari angka-angka terkemuka untuk mewakilinya.
ooutwire
5

Sudah dikatakan dalam jawaban lain yaitu 00023angka; Saya hanya ingin menambahkan bahwa Anda dapat menggunakan kolom yang dihitung untuk menunjukkan angka itu menggunakan format khusus. Sebagai contoh,

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'
a1ex07
sumber
Poin bagus, benar-benar layak diperhatikan.
Grant Fritchey
0

0023 adalah angka tetapi int dan tipe data angka lainnya tidak menyimpan angka nol di depan karena tidak ada alasan matematika untuk melakukannya.

Jika Anda perlu menyimpan angka nol terkemuka, gunakan tipe data string seperti, char, varchar dll

Jimbo
sumber
1
Jika kita mengasumsikan bahwa itu INTadalah fixed-length (seperti 32 bit) dan notasi biner digunakan untuk menyimpannya, maka angka nol di depan memang disimpan. Tetapi mereka tidak ditampilkan dalam output.
ypercubeᵀᴹ
@ ypercube - Benar, tetapi jumlah nol di depan hanyalah apa yang diperlukan untuk mengisi 32 bit (sebagai lawan dari yang dapat ditentukan pengguna).
Nick Chammas
@Nick: Ya, tidak perlu berdebat di sana. Saya pikir intinya adalah BUKAN apakah angka nol terkemuka disimpan atau tidak. Itu apakah dua versi dari nomor yang sama dapat disimpan dalam tipe data, satu dengan dan satu tanpa nol terkemuka.
ypercubeᵀᴹ
Tetapi ini tidak masuk akal. Dua nol terdepan desimal sama sekali tidak ada hubungannya dengan jumlah nol terdepan dalam bilangan bulat 32-bit. Pertimbangkan angka desimal 15- ini hanya membutuhkan satu digit dalam heksadesimal F,. Mereka sudah memiliki jumlah "nol terkemuka" yang berbeda. 2147483647 adalah 10 digit, tetapi dalam hex itu hanya 7FFFFFFF atau 8 digit.
ErikE
Pada dasarnya, kita harus mempertimbangkan sistem angka matematika yang kita gunakan ... dalam hal ini desimal (basis 10). 23 adalah angka desimal; itu adalah 0x1000 + 0x100 + 2x10 + 3 = 23. Pada oktal, 2X8 + 3 dan seterusnya. Jadi, untuk mengatakan ke mesin penyimpanan, "menyimpan 23 dengan dua nol terkemuka" tidak berguna, karena hanya menyandikan hasil akhir yang sama, yaitu 23. SQL Server tidak mengabaikan nol Anda, itu hanya mengembalikan kepada Anda nilai desimal sama dengan angka yang Anda masukkan, yaitu, 0023 atau 23.
ooutwire