ฉันจะรักษาค่าศูนย์นำหน้าได้อย่างไรเมื่อฉันใส่ตัวเลขลงในตารางนี้ [ปิด]


10

ฉันได้แทรกสองระเบียนลงในตาราง

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

23เมื่อผมสอบถามพวกเขาพวกเขาทั้งหมดเป็นจอแสดงผล หมายความว่า SQL Server ละเว้น 0s ชั้นนำ กลไกเบื้องหลังคืออะไร ฉันจะให้ SQL Server คืนค่าตามที่ฉันแทรก (เช่น0023และ23) ได้อย่างไร


2
ทำไมคุณถึงสนใจศูนย์นำหน้า หากพวกเขามีความหมายต่อระบบของคุณก็idควรเป็นประเภทVARCHARหรือคล้ายกัน
Nick Chammas

คุณคาดหวังได้อย่างไรว่า 0023 จะถูกเข้ารหัสในฐานข้อมูลเป็นสิ่งที่แตกต่างจาก 23 หรือ 023 หรือ 0000000023 พวกเขาทั้งหมดเป็นตัวแทนจำนวนเดียวกัน และ int เป็นชนิดข้อมูล NUMBER เซิร์ฟเวอร์ไม่มีที่สำหรับจัดเก็บค่า "เลขศูนย์นำหน้าทศนิยม" นี้
ErikE

นี่เป็นคำถามที่ไม่ดีและจะถูกกล่าวถึงในบทนำของคลาสโปรแกรม int ไม่สามารถเก็บค่าศูนย์นำหน้าได้เนื่องจากลักษณะของ ints สิ่งนี้สามารถแก้ไขได้โดยดูที่ทรัพยากรบนเว็บจำนวนเท่าใดก็ได้ สิ่งนี้ไม่ต้องการอินพุตของผู้ดูแลระบบฐานข้อมูล
jcolebrand

1
เลขศูนย์นำหน้าจะบอกเป็นนัย นอกเหนือจากการใช้สตริงแทนหากคุณต้องการเลขศูนย์นำหน้าจำนวนหนึ่งนั่นคือข้อมูลเพิ่มเติมนอกเหนือจากที่เก็บไว้ในคอลัมน์ int ตัวเลือกหนึ่งกำลังใช้คอลัมน์สตริง แต่อีกตัวเลือกหนึ่งคือการเก็บจำนวนเลขศูนย์นำหน้าในคอลัมน์อื่นหรือใน UI หาก UI จัดรูปแบบตัวเลข 4 หลักด้วยการเติมศูนย์นำหน้าเสมอคุณจะเก็บข้อมูลนี้ไว้ใน UI หากคุณต้องการเลขศูนย์ให้แตกต่างกันและเก็บรักษาไว้สำหรับแต่ละระเบียนคุณสามารถจัดเก็บข้อมูลนั้นในฟิลด์แยกแทน
Dave Cousineau

คำตอบ:


27

0023ไม่ใช่ตัวเลข มันเป็นสตริง 23คือจำนวน SQL Server สามารถรับรู้ว่าไม่จำเป็นต้องมีค่าศูนย์พิเศษเหล่านั้นในการกำหนดจำนวนดังนั้นจึงไม่ต้องสนใจ หากคุณต้องการแจกจ่ายค่าเป็น 0023 ให้กับแอปพลิเคชันฉันขอแนะนำให้ทำการจัดรูปแบบทางด้านแอปพลิเคชัน ด้วยวิธีนี้จำนวนที่เก็บไว้ใน SQL Server ยังคงเป็นตัวเลขหากคุณต้องการทำการบวกการรวมหรือการคำนวณอื่น ๆ หากคุณต้องเก็บเป็น ' 0023' คุณจะต้องแปลงเป็นฟิลด์ตัวอักษร ถ่าน, varchar, nvarchar, nchar


หาก 0023 เป็นสตริงฉันจะแทรกค่าลงในตารางที่ฉันกำหนด id เป็นรูปแบบ int ได้อย่างไร
user8365

@ user8365 - กำหนดidอย่างใดอย่างหนึ่งVARCHARหรือเพียงแค่แทรก 23 แทน 0023
Lamak

5
@ user8365 - คุณกำลังถามว่าคุณสามารถทำให้ SQL Server ละเมิดความสมบูรณ์ของโดเมนของฟิลด์นั้นหรือไม่ คุณทำไม่ได้ ถ้า0023เป็นสตริงให้เก็บเป็นสตริง หากไม่เป็นเช่นนั้นให้จัดเก็บเป็น INT และลืมเลขศูนย์นำหน้า
Nick Chammas

สิ่งที่ @NickChammas พูดจริงๆ คุณไม่มีทางเลือกใด ๆ ที่นี่ 23 คือตัวเลข 0023 คือสตริง หากคุณต้องการตัวเลขให้ถือว่าเป็นตัวเลข เช่นเดียวกับคำตอบของฉันบอกว่าถ้ามันจำเป็นต้องเรียงลำดับเช่นตัวเลข, บวก, ลบ, คูณ, หาร, ฯลฯ เช่นหมายเลขแล้วมันต้องเป็นตัวเลข ไม่มีทางเลือก ไม่มีข้อโต้แย้ง ศูนย์นำหน้าเป็นเพียงการจัดรูปแบบ ทำเช่นนั้นในรหัสแอปหรือที่อื่น
Grant Fritchey

@Grant ฉันไม่สามารถตกลงได้ว่าเลขศูนย์นำหน้าเป็นเพียงการจัดรูปแบบ พวกมันถูกต้องตามกฎหมายในระบบตัวเลขใด ๆ อย่างไรก็ตาม 0023b10 = 23b10; ดังนั้นระบบจัดเก็บข้อมูลจะได้รับการบีบอัดในระดับหนึ่งโดยไม่เข้ารหัสศูนย์นำทั้งหมด ดังนั้นผู้ถามของเราจึงถามคำถามผิด ทำไม 0023 ไม่ใช่จำนวนเต็ม? มันเป็นจำนวนเต็ม! เราไม่จำเป็นต้องเข้ารหัสอินฟินิตี้ของตัวเลขนำหน้าเพื่อแทนค่าดังกล่าว
ooutwire

5

มันถูกกล่าวแล้วในคำตอบอื่น ๆ ที่00023เป็นตัวเลข ฉันแค่ต้องการเพิ่มว่าคุณสามารถใช้คอลัมน์จากการคำนวณเพื่อแสดงหมายเลขนั้นโดยใช้รูปแบบที่กำหนดเอง ตัวอย่างเช่น,

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'

จุดดีคุ้มค่าอย่างแน่นอน
Grant Fritchey

0

0023 เป็นตัวเลข แต่ชนิดข้อมูล int และหมายเลขอื่นไม่เก็บศูนย์นำหน้าเนื่องจากไม่มีเหตุผลทางคณิตศาสตร์ให้ทำ

หากคุณต้องการเก็บเลขศูนย์นำหน้าให้ใช้ชนิดข้อมูลสตริงเช่น, char, varchar เป็นต้น


1
หากเราสมมติว่าINTมีความยาวคงที่ (เช่น 32 บิต) และใช้สัญลักษณ์เลขฐานสองสำหรับการจัดเก็บดังนั้นเลขศูนย์นำหน้าจะถูกเก็บไว้แน่นอน แต่จะไม่แสดงในผลลัพธ์
ypercubeᵀᴹ

@ypercube - ถูกต้อง แต่จำนวนของศูนย์นำหน้าเป็นเพียงสิ่งที่จำเป็นในการเติม 32 บิต (ตรงข้ามกับที่ผู้ใช้กำหนดได้)
Nick Chammas

@Nick: ใช่ไม่เถียง ฉันคิดว่าประเด็นนี้ไม่ใช่ศูนย์หรือไม่ มันคือการที่สามารถเก็บหมายเลขเดียวกันสองรุ่นในประเภทข้อมูลหนึ่งและอีกหนึ่งโดยไม่มีเลขศูนย์นำหน้า
ypercubeᵀᴹ

แต่มันก็ไม่สมเหตุสมผล เลขศูนย์นำหน้าทศนิยมสองตำแหน่งไม่มีความสัมพันธ์ใด ๆ กับจำนวนของเลขศูนย์นำหน้าในจำนวนเต็ม 32 บิต พิจารณาตัวเลขทศนิยม - 15ใช้เวลาเพียงหนึ่งหลักในเลขฐานสิบหก, F. พวกเขามี "เลขศูนย์นำหน้า" อยู่จำนวนหนึ่งแล้ว 2147483647 คือ 10 หลัก แต่ในฐานสิบหกที่มีเพียง 7FFFFFFF หรือ 8 หลัก
ErikE

โดยพื้นฐานแล้วเราจะต้องพิจารณาระบบตัวเลขทางคณิตศาสตร์ที่เราใช้ ... ในกรณีทศนิยมนี้ (ฐาน 10) 23 คือตัวเลขทศนิยม มันคือ 0x1000 + 0x100 + 2x10 + 3 = 23 ในฐานแปดมันคือ 2X8 + 3 เป็นต้น ดังนั้นในการพูดกับเอ็นจิ้นการจัดเก็บ "เก็บ 23 กับศูนย์นำสอง" ไม่ได้มีประโยชน์เพราะมันเพียงแค่เข้ารหัสผลลัพธ์สุดท้ายเดียวกันนั่นคือ 23. SQL Server ไม่สนใจเลขศูนย์ของคุณมันแค่คืนค่าทศนิยมให้คุณ เท่ากับจำนวนที่คุณแทรกเช่น 0023 หรือ 23
ooutwire
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.