Đối với bảng MyISAM, NULL tạo thêm một bit cho mỗi cột NULLABLE (bit rỗng) cho mỗi hàng. Nếu cột không phải là NULLABLE, thì không cần thêm chút thông tin nào nữa. Tuy nhiên, đó là đệm ra 8 bit byte, do đó bạn luôn có được 1 + mod 8 byte cho số cột NULLABLE. 1
Các cột văn bản hơi khác so với các kiểu dữ liệu khác. Đầu tiên, đối với "", mục nhập bảng chứa chiều dài hai byte của chuỗi theo sau là các byte của chuỗi và là một cấu trúc chiều dài biến thể. Trong trường hợp NULL, không cần thông tin về độ dài nhưng nó bao gồm anyways như là một phần của cấu trúc cột.
Trong InnoDB, NULLS không có khoảng trống: Chúng đơn giản không tồn tại trong tập dữ liệu. Điều này cũng đúng đối với chuỗi rỗng vì bù lệch dữ liệu không tồn tại. Sự khác biệt duy nhất là các NULL sẽ có bộ bit NULL trong khi các chuỗi rỗng sẽ không. 2
Khi dữ liệu thực sự được đặt trên đĩa, NULL và '' chiếm chính xác không gian chung trong cả hai loại dữ liệu. Tuy nhiên, khi giá trị được tìm kiếm, kiểm tra NULL là hơi nhanh hơn sau đó kiểm tra '' vì bạn không phải xem xét độ dài dữ liệu trong các phép tính của mình: bạn chỉ kiểm tra bit rỗng.
Như một kết quả của sự NULL và '' khác biệt không gian, NULL và '' có NO IMPACT SIZE trừ khi cột được quy định để được nullable hay không. Nếu cột là NOT NULL, chỉ trong bảng MyISAM bạn sẽ thấy bất kỳ sự khác biệt peformance (và sau đó, rõ ràng, mặc định NULL không thể được sử dụng vì vậy nó là một câu hỏi tranh luận).
Câu hỏi thực tế sau đó tóm tắt giải thích ứng dụng của cột "không có giá trị được đặt ở đây". Nếu "" là một giá trị hợp lệ có nghĩa là "người dùng nhập vào không có gì ở đây" hoặc somesuch, sau đó mặc định NULL là thích hợp hơn khi bạn muốn phân biệt giữa NULL và "" khi một bản ghi được nhập mà không có dữ liệu trong đó.
Thông thường, mặc định thực sự chỉ hữu ích cho việc tái cấu trúc cơ sở dữ liệu, khi các giá trị mới cần có hiệu lực trên dữ liệu cũ. Trong trường hợp đó, một lần nữa, sự lựa chọn phụ thuộc vào cách dữ liệu ứng dụng được diễn giải như thế nào. Đối với một số dữ liệu cũ, NULL là hoàn toàn thích hợp và phù hợp nhất (cột không tồn tại trước đây vì vậy nó có giá trị NULL ngay bây giờ!). Đối với những người khác, "" là thích hợp hơn (thường là khi các truy vấn sử dụng SELECT * và NULL gây ra sự cố sự cố).
Trong các điều khoản chung của ULTRA (và từ quan điểm triết học) NULL mặc định cho cột NULLABLE được ưu tiên vì nó cung cấp giải thích ngữ nghĩa tốt nhất của "Không có giá trị xác định".
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]
Giống như hầu hết các câu hỏi "tốt hơn cho không gian đĩa và hiệu suất": tại sao bạn không chèn hàng triệu hàng bằng NULL, kiểm tra một số truy vấn và kiểm tra dung lượng đĩa? Lặp lại với "" s, và một lần nữa với một kết hợp tương đối thậm chí. Và câu trả lời là đáng tin cậy hơn nhiều so với những gì một số chàng trai ngẫu nhiên trên SO nói;) – ojrac
haha, Tôi thích các ý kiến cập nhật – Xeoncross