Xem xét các thông tin sau đến từ các trang tài liệu Microsoft SQL:
Công cụ cơ sở dữ liệu SQL Server tối ưu hóa việc lưu trữ các cột bit. Nếu có 8 hoặc ít hơn các cột bit trong một bảng, các cột được lưu trữ dưới dạng 1 byte. Nếu có từ 9 đến 16 cột, các cột được lưu dưới dạng 2 byte, v.v.
Xem: https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017
Vì vậy, nếu tôi tạo một bảng mới như thế này:
CREATE TABLE MyTable (
Id int PRIMARY KEY,
Value1 bit,
Value2 bit,
Value3 bit,
Value4 bit,
Value5 bit,
Value6 bit,
Value7 bit,
Value8 bit)
... sau đó tất cả các cột bit (Value1, Value2, ... Value8) trong một hàng sẽ chiếm một byte. Hoặc là?
Khi chúng ta xem xét kỹ hơn, trường Value1 của một hàng có thể có các giá trị 0, 1 hoặc NULL bên trong. Điều này có nghĩa là trường thực sự có giá trị 3 trạng thái hoặc giá trị ternary. 2 giá trị như vậy có thể đại diện cho từ điển của 3 * 3 = 9 giá trị. 8 giá trị như vậy là một từ điển của 6561 giá trị.
Nếu chúng ta đang nghĩ về dấu chân bộ nhớ của một hàng như vậy, 8 bit sẽ chiếm một byte. Điều này có nghĩa là một byte này mã hóa 6561 giá trị thay vì 256 giá trị. Điều này rõ ràng là sai.
Vì vậy, hoặc các tài liệu MS SQL là sai lệch hoặc chúng ta đang nói về một số tính toán lượng tử ở đây. Tất nhiên đó là câu hỏi trước đây, nhưng điều tôi thực sự muốn biết là câu trả lời cho câu hỏi này: làm thế nào các bit nullable (và tất nhiên các bit SQL Server là null theo mặc định) thực sự được lưu trữ trong các cấu trúc cơ sở của SQL Server?