SQL Server가 서명되지 않은 데이터 형식을 지원하지 않는 이유는 무엇입니까?


84

나는 특별히 unsigned에 대해 생각하고 int있습니다.

다음은 실용적인 예입니다. ID 열이 최대 값을 초과하면 어떻게합니까? 이동 BigInt(4 대신 8 바이트 저장)하거나 음의 정수를 지원하도록 응용 프로그램을 리팩터링 하고이 답변에 표시된대로 자체 규칙을 만들 수도 있습니다 . 이러한 옵션 중 어느 것도 최적이 아닙니다.

UInt 이상적인 솔루션이지만 SQL Server는이를 제공하지 않습니다 (MySQL이 제공하는 경우).

서명되지 않은 데이터 유형은 SQL 표준 (SQL-2003)의 일부가 아니지만 여전히 저에게 낭비 인 것처럼 보입니다.

이러한 항목을 포함하지 않은 이유는 무엇입니까 (SQL Server 또는 표준에 포함)?


11
SQL Server 디자인 팀에게 물어보세요 ... 또한 : 정말 20 억 개의 INT IDENTITY 값을 최대 로 할 수 있습니까 ?? 정말?!?!?! 처리중인 행이 20 억 개 이상인 경우 디스크 공간을 조금 절약하고 BIGINT를 IDENTITY로 사용할 수 있습니다 ....
marc_s

6
marc_s가 무슨 뜻이야? 50 년 동안 800ms마다 삽입 만하면됩니다. 테이블에 그런 종류의 활동이 없나요? :)
Mike M.

22
@Mike M : 우리 모두가 미키 마우스 앱을 작업하는 것은 아닙니다. 우리는 2 년 이내에 30 억 개 이상의 bigint를 사용했습니다. 피크는 초당> 2000 행입니다.
gbn

5
@gbn 나는 아무도 그 부하를 가지고 있지 않다는 것을 암시하려는 것이 아닙니다. 그러나 앞서 말했듯이 초당 2000 행을 초과하는 경우 추가 2B는 원인에 도움이되지 않습니다.
Mike M.

11
@Mike M 및 @marc_s, 20 억 행 테이블이있는 시스템에서 작업하는 경우 낭비되는 스토리지에주의를 기울일 수 있습니다. 인덱스 페이지 크기와 인덱스 스캔 성능에주의를 기울일 수 있습니다. 그런 상황에서 공간을 낭비하지 않기를 바랍니다.
Romhein 2010

답변:


66

추측해야한다면 유형의 확산을 피하기 위해 노력하고 있다고 말할 수 있습니다. 일반적으로 말하면 부호없는 정수가 할 수있는 것 중 부호있는 정수가 할 수없는 것은 없습니다. 2147483648에서 4294967296 사이의 숫자가 필요한 경우에는 숫자가 결국 4294967296을 초과하므로 8 바이트 정수로 이동해야합니다.


3
나는 이것이 우리가이 질문에 대한 답을 얻을 수있는 가장 가까운 것이라고 생각합니다. 감사.
Romhein

8
'유형의 확산'이 공간 / 돈을 절약 할 수 있었다면 왜 이것이 악일 수 있다고 생각하십니까?
Samuel

1
ORDER BY ABS(Id)특히 열이 클러스터 된 기본 키인 경우 해당 값으로 행을 가져 오는 속도도 느려집니다 (예 :). 예를 들어 32 비트 유닉스 타임 스탬프를 사용하는 것은 표준 SQL 날짜 시간에서 4 바이트를 줄이는 편리한 방법입니다.
Groo

57

이를 위해 -2,147,483,648을 시드 값으로 사용할 수 있습니다.

Identity(-2147483648, 1)

1
하 나는이 대답을 절대적으로 좋아합니다. 나는 그것을 구현할 것인지 확신하지 못하지만 그것은 당신의 ID의 절반이 사용되지 않는 문제를 확실히 해결했습니다.
Kevin

46

Microsoft Office Dev Center에서 비슷한 질문 찾았습니다 .

Jim Hogg (프로그램 관리자)의 답변에는 서명되지 않은 int를 추가하는 데 대한 장단점이 있습니다. 가장 큰 단점은 암시 적 형식 변환을 구현하는 규칙이 제대로 작동하는 데 악몽이된다는 것입니다.

요청이 "Wo n't Fix"로 종료되었습니다.


링크가 더 이상 작동하지 않아 원래 답변을 읽을 수 없습니다. 하지만 문제는 그것이 악몽이라는 것이 아니라고 생각합니다. 어떻게하는지에 대한 표준이 없다는 것입니다. 예를 들어 MySQL이하는 일을 할 수 있지만 (다른 DBMS가 UNSIGNED를 지원한다고 생각하지 않습니다), 다른 DBMS가 표지판에 대한 지원을 추가하면 다른 규칙을 사용할 수 있습니다. 변환 설계는 중요한 문제입니다. JavaScript는 진지하게 받아들이지 않을 때 일어나는 일의 예입니다.
Federico Razzoli

업데이트 된 링크-MSSN Office 개발자 포럼에 대한 Jim Hogg의 의견.
Anthony K

1

표준이 아니기 때문에 SIGNED 및 UNSIGNED 키워드를 지원하지 않습니다. SQL 표준에서는 모든 숫자 유형이 서명됩니다.

UNSIGNED (및 기본값 인 SIGNED)는 더 높은 부호없는 숫자를 동일한 바이트 수에 저장하고 음수를 허용하지 않는 데 유용 할 수있는 MySQL 확장입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.