2010-06-02 3 views
17

저는 SQL/데이터베이스에 대해 전혀 모릅니다. 그러나 일부 데이터베이스가 true 및 false 이외에 NULL 값을 가질 수있는 "부울"필드를 ​​사용하는 방법에 대해 많은 데이터베이스 작업을 수행하는 친구와 이야기하고있었습니다.Microsoft는 3 비트 필드를 단일 비트에 저장할 수 있습니까?

마이크로 소프트의 말에 따르면, 그는 그런 종류의 필드를 부울로 언급하지 않았으며 단지 비트라고 부릅니다. 또는 더 적은 비트 필드를 레코드에 저장하면 모든 데이터를 저장하는 데 1 바이트 만 필요합니다. "

당연히 내게는 불가능한 것처럼 보입니다. 필드가 3 개의 값을 가질 수 있다면 8 개를 1 바이트에 맞출 수 없습니다. 내 친구는 이상하게 보였지만 낮은 수준의 내부에 대해 모르는 것을 간청하면서 동의했다. SQL 측에서 볼 때 이러한 필드는 세 가지 값을 가질 수 있으며 저장 바이트가 필요하다. . 우리 중 한 명에게 전선이 있다고 상상해 봅니다. 아무도 여기에서 실제로 일어나고있는 것을 설명 할 수 있습니까?

+16

Jon Skeet은 3 비트 필드를 단일 비트에 저장할 수 있습니다. –

+0

@codeka hahahahahaha –

+1

Gaahhhhh 나는 그것을보아야했다! – fenomas

답변

19

null storage에 대한 좋은 설명을 보려면 How does SQL Server really store NULL-s을 읽는 것이 좋습니다. 간단히 말해 null/not null 비트는 다른 위치, 즉 행의 null 비트 맵에 저장됩니다. 문서에서

:

각 행은 널 (null)을 허용 열에 대한 널 비트 맵을 가지고있다. 그 열에있는 행이 널이면 비트 맵 내의 비트는

0의 1 밖에되도록 8 비트 열이 1 바이트에 저장되어있는 실제의 값은 행의 당 비트가 있지만 열이 NULL인지 아닌지를 나타내는 null 비트 맵 ... 그래서 계산 방법에 따라 다릅니다. 이 완전하게이되도록하려면 8 비트 열은 2 바이트을 사용하고 2 개의 다른 위치로 분할하면됩니다.

+0

아, 이렇게 생각해야합니다. 피투성이의 세부 사항에 대한 링크 주셔서 감사합니다! – fenomas

+0

명성 상승은 SO에있는 모든 사람들의 가장 높은 증가 중 하나 여야합니다. 나는 당신의 대표 그래프의 경사에 흥미를 느꼈다. –

+0

@Mitch - 하하 나는 그것을 가리켜 주셔서 감사합니다. –

7

null 표시기는 별도로 저장되므로 null 허용 가능 비트에는 실제로 2 비트가 필요합니다. 엄격히 말하면 "null"은 세 번째 값이 아닙니다. 그것은 "여기에 가치가있을 수 있지만 그것이 무엇인지 모릅니다."라고 말하는 자리 표시 자의 일종입니다. 따라서 비트가 null 인 경우이를 true로 비교하면 비교가 실패하지만 false로 비교하면 비교가 실패합니다.

3

정확합니다. 8 개의 true/false 값을 단일 바이트로 패킹 할 수 있지만 NULL인지 여부를 나타내는 추가 저장 영역이 필요합니다. 3을 나타내는 다른 상태는 2 입니다.

2

친구가 맞지만 동시에 잘못되었습니다. BIT 필드가 세 가지 다른 값을 유지할 수있는 것으로 간주 될 수 있지만 정의에 따라 NULL은 값이 없습니다.

또한 비트 필드에 NULL을 허용하면 해당 필드에 2 비트가 사용됨을 의미합니다 (하나는 값, NULL은 그렇지 않으면 1 비트). 그러나 필드의 NULL 상태 (NULL 비트)는 주어진 열에 대한 정확한 메모리 공간이 아니라 행에 대한 비트 맵에 저장됩니다.

1

다른 사람들은 이미 BIT가 2 비트가 아니라 1 비트가 필요하다고 말했습니다.

자주 잊어 버리는 또 다른 중요한 사항은 다음과 같습니다. SQL Server의 비트가 부울 또는 논리 데이터 형식이 아닙니다. 이는 숫자 (정수) 데이터 유형입니다. "An integer data type that can take a value of 1, 0, or NULL". Bit는 숫자 연산자 (<,>, +, -) 만 지원합니다.어떤 논리 연산자 (AND, OR, NOT 등)도 지원하지 않습니다.