이 테이블에 숫자를 삽입 할 때 선행 0을 어떻게 유지합니까? [닫은]


10

두 개의 레코드를 테이블에 삽입했습니다.

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

쿼리하면 모두로 표시됩니다 23. 이는 SQL Server가 선행 0을 무시 함을 의미합니다. 그 배후의 메커니즘은 무엇입니까? 삽입 한 값 (예 : 002323) 을 SQL Server가 반환하도록하려면 어떻게해야 합니까?


2
왜 선행 제로에 관심이 있습니까? 그것들이 당신의 시스템에 의미가 있다면, id유형 VARCHAR또는 유사 해야합니다 .
Nick Chammas 2016 년

정확히 0023이 23 또는 023 또는 0000000023과 다른 것으로 데이터베이스에서 인코딩 될 것으로 어떻게 예상합니까? 그들은 모두 같은 NUMBER를 나타냅니다. int는 NUMBER 데이터 형식입니다. 서버가이 "소수점 10 진수 0"값을 저장할 장소는 없습니다.
ErikE

이것은 좋지 않은 질문이며 프로그래밍 클래스에 대한 소개에서 다루었을 것입니다. int는 int의 특성으로 인해 선행 0을 저장할 수 없습니다. 이것은 많은 웹 리소스를 보면 해결할 수 있습니다. 데이터베이스 관리자의 입력이 필요하지 않습니다.
jcolebrand

1
선행 0이 내포됩니다. 대신 문자열을 사용하는 것 외에도 특정 수의 선행 0이 필요한 경우 int 열에 저장된 것 이상의 추가 정보입니다. 한 옵션은 문자열 열을 사용하지만 다른 옵션은 다른 열이나 UI에 선행 0 수를 저장하는 것입니다. 예를 들어, UI가 항상 패딩 선행 0을 사용하여 4 자리로 형식화하면이 정보를 UI에 저장 한 것입니다. 각 레코드에 대해 0을 다양하게 유지해야하는 경우 해당 정보를 별도의 필드에 대신 저장할 수 있습니다.
Dave Cousineau

답변:


27

0023숫자가 아닙니다. 문자열입니다. 23숫자입니다. SQL Server는 숫자를 정의하는 데 이러한 추가 0이 필요하지 않으므로이를 무시합니다. 응용 프로그램에 0023으로 값을 표시하려면 응용 프로그램 측에서 서식을 지정하는 것이 좋습니다. 그런 식으로 더하기, 집계 또는 다른 계산을 원할 경우 SQL Server에 저장된 숫자는 여전히 숫자입니다. 실제로 ' 0023' 로 저장 해야하는 경우 문자 필드로 변환해야합니다. char, varchar, nvarchar, nchar.


0023이 문자열 인 경우 ID를 int 형식으로 정의한 테이블에 값을 삽입하려면 어떻게해야합니까?
user8365

@ user8365 - 어느 정의 idVARCHAR하거나 (23) 대신 0023 삽입
Lamak

5
@ user8365-SQL Server 가 해당 필드 의 도메인 무결성 을 위반하도록 할 수 있는지 묻습니다 . 당신은 할 수 없습니다. 0023문자열 인 경우 문자열로 저장하십시오. 그렇지 않은 경우 INT로 저장하고 선행 0을 잊어 버리십시오.
Nick Chammas 2016 년

@NickChammas가 정확히 말한 것. 여기서 선택의 여지가 없습니다. 23은 숫자이고 0023은 문자열입니다. 숫자를 원하면 숫자로 취급하십시오. 내 대답에서 알 수 있듯이 숫자처럼 숫자를 정렬하거나 더하기, 빼기, 곱하기, 나누기 등을 해야하는 경우 숫자 여야합니다. 선택이 없습니다. 논쟁이 없다. 선행 0은 형식입니다. 앱 코드 또는 어딘가에서 수행하십시오.
Grant Fritchey

@Grant 나는 0이 단지 형식화되고 있다는 것에 동의 할 수 없다. 그들은 어떤 숫자 체계에서도 합법적입니다. 그러나 0023b10 = 23b10; 따라서 모든 스토리지 시스템은 모든 선행 0을 인코딩하지 않으므로 어느 정도의 압축률을 얻습니다. 따라서 근본적으로 우리의 질문자는 잘못된 질문을합니다. 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 및 기타 숫자 데이터 형식은 수학적인 이유가 없으므로 선행 0을 저장하지 않습니다.

선행 0을 저장 해야하는 경우 char, varchar 등과 같은 문자열 데이터 유형을 사용하십시오.


1
INT32 비트와 같이 고정 길이 라고 가정 하고 이진 표기법을 사용하여이를 저장하면 선행 0이 실제로 저장됩니다. 그러나 출력에는 표시되지 않습니다.
ypercubeᵀᴹ

@ypercube-맞습니다. 그러나 선행 0의 수는 단순히 사용자 정의가 아닌 32 비트를 채우는 데 필요한 것입니다.
Nick Chammas 2016 년

@Nick : 예, 논쟁은 없습니다. 요점은 선행 0이 저장되는지 여부가 아니라고 생각합니다. 동일한 숫자의 두 가지 버전을 데이터 유형에 저장할 수 있는지 여부입니다 (하나는 앞에 0이 있거나없는 것).
ypercubeᵀᴹ

그러나 이것은 말이되지 않습니다. 두 개의 10 진수 선행 0은 32 비트 정수의 선행 0 수와 전혀 관련이 없습니다. 십진수를 고려하십시오. 이것은 1516 진수로 된 한 자릿수 만 사용합니다 F. 그들은 이미 다른 수의 "리딩 제로"를 가지고 있습니다. 2147483647은 10 자리이지만 16 진수는 7FFFFFFF 또는 8 자리입니다.
ErikE

기본적으로 우리가 사용하는 수학 숫자 시스템을 고려해야합니다 ...이 경우 10 진수 (기본 10). 23은 10 진수입니다. 0x1000 + 0x100 + 2x10 + 3 = 23입니다. 8 진수에서는 2X8 + 3입니다. 따라서 저장소 엔진에 "두 개의 0이 0 인 저장소 23"은 동일한 최종 결과 (23) 만 인코딩하기 때문에 유용하지 않습니다. SQL Server는 0을 무시하지 않고 10 진수 값만 반환합니다. 삽입 한 번호와 같습니다 (예 : 0023 또는 23).
ooutwire
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.