2010-06-02 29 views
17

Tôi hoàn toàn không biết gì về SQL/cơ sở dữ liệu, nhưng tôi đang trò chuyện với một người bạn làm rất nhiều cơ sở dữ liệu về cách một số cơ sở dữ liệu sử dụng trường "boolean" có thể lấy giá trị NULL ngoài true và false.Microsoft có thể lưu trữ ba trường có giá trị trong một bit không?

Về vấn đề này, ông đã đưa ra nhận xét theo các dòng sau: "Để tín dụng của Microsoft, họ chưa bao giờ gọi loại trường đó là boolean, họ chỉ gọi nó là một chút. Và đó là một bit thực - nếu bạn có tám hoặc ít bit trường trong một bản ghi, nó chỉ yêu cầu một byte để lưu trữ tất cả. "

Đương nhiên điều đó dường như không thể đối với tôi - nếu trường có thể chứa ba giá trị bạn sẽ không phù hợp với tám giá trị của chúng thành một byte. Bạn tôi đồng ý rằng nó có vẻ kỳ quặc, nhưng cầu xin sự thiếu hiểu biết của những người cấp thấp và nói rằng cho đến nay ông biết, các lĩnh vực như vậy có thể giữ ba giá trị khi nhìn từ phía SQL, và nó hoạt động để yêu cầu một byte lưu trữ . Tôi tưởng tượng một người trong chúng ta có một sợi dây chéo. Bất cứ ai có thể giải thích những gì thực sự xảy ra ở đây?

+16

Jon Skeet có thể lưu trữ ba trường có giá trị trong một bit. –

+0

@codeka hahahahahaha –

+1

Gaahhhhh Tôi đáng lẽ phải thấy điều đó! – fenomas

Trả lời

19

Tôi khuyên bạn nên đọc phần này để có giải thích tốt về bộ nhớ trống: How does SQL Server really store NULL-s. Tóm lại, bit null/null không được lưu trữ ở một nơi khác, bitmap rỗng cho hàng.

Từ bài viết:

Mỗi hàng có một bitmap null cho cột cho phép null. Nếu hàng trong cột đó là null sau đó một chút trong bitmap là 1 ai khác đó là 0.

Vì vậy, trong khi giá trị thực tế cho 8 cột bit được lưu trữ trong 1 byte, có bit thêm ở hàng của null bitmap chỉ ra rằng cột đó là NULL hay không ... do đó phụ thuộc vào cách bạn đang đếm. Để được hoàn toàn các cột 8 bit chính xác, sử dụng 2 byte, chỉ chia thành 2 vị trí khác nhau.

+0

Ah, tôi nghĩ rằng nó phải là một cái gì đó như thế này. Cảm ơn bạn đã liên kết đến các chi tiết đẫm máu! – fenomas

+0

bạn tăng danh tiếng phải có một trong những mức tăng cao nhất của bất kỳ ai trên SO. Tôi đã bị hấp dẫn bởi độ dốc của biểu đồ đại diện của bạn! –

+0

@Mitch - Haha Tôi đã không kiểm tra nó trong một thời gian đó là khá mát mẻ, cảm ơn đã chỉ nó ra :) –

7

Chỉ báo rỗng được lưu trữ riêng biệt, vì vậy bit vô hiệu thực sự yêu cầu hai bit. Và nói đúng, "null" không phải là giá trị thứ ba; nó là một trình giữ chỗ nói rằng, "Có thể có một giá trị ở đây, nhưng chúng ta không biết nó là gì." Vì vậy, nếu một bit là null, bạn có thể so sánh nó với giá trị true và so sánh sẽ thất bại, nhưng bạn cũng có thể so sánh nó với sai và so sánh sẽ thất bại.

3

Bạn đã chính xác. Bạn có thể đóng gói tám giá trị true/false thành một byte duy nhất, nhưng bạn vẫn cần thêm dung lượng để cho biết nó có phải là NULL hay không. Đại diện cho 3 các trạng thái khác nhau chỉ với 2 là không thể.

2

Bạn của bạn đúng, nhưng không đúng lúc đó. Có thể cho một trường BIT được coi là có thể duy trì ba giá trị khác nhau, nhưng theo định nghĩa NULL là sự vắng mặt của một giá trị.

Ngoài ra, cho phép NULL trên các trường bit, có nghĩa là 2 bit sẽ được sử dụng cho trường đó (một cho giá trị và một cho nếu nó là NULL hay không). Nhưng trạng thái NULL của trường (bit NULL) được lưu trữ trong một bitmap cho hàng, và không phải trong không gian bộ nhớ chính xác cho cột đã cho.

1

Những người khác đã nói rằng BIT yêu cầu 2 bit, không phải một.

Một điểm quan trọng khác thường bị quên: Bit trong SQL Server không phải là loại dữ liệu logic hoặc logic; đó là kiểu dữ liệu số (số nguyên). "An integer data type that can take a value of 1, 0, or NULL". Bit chỉ hỗ trợ các toán tử số (<,>, +, -).Nó không hỗ trợ bất kỳ toán tử logic nào (AND, OR, NOT, v.v.).

Các vấn đề liên quan