Bất kể độ dài bạn xác định cho cột varchar của bạn là bao nhiêu, không gian lưu trữ được sử dụng bởi một cột trống sẽ giống nhau.
Các loại CHAR và VARCHAR
Điều này chỉ giải quyết không gian được sử dụng bởi cột varchar và không xem xét tổng không gian lưu trữ được sử dụng bởi hàng, chỉ mục của nó, khóa chính và các cột khác.
Như ypercube đã đề cập trong bình luận của mình, có những cân nhắc bổ sung cho toàn bộ lưu trữ hàng khi có ít nhất một cột nullable.
Cấu trúc hàng vật lý của Innodb
Phần có độ dài thay đổi của tiêu đề bản ghi chứa một vectơ bit để chỉ ra các cột NULL. Nếu có bất cứ nơi nào từ 9 đến 15 cột có thể là NULL, vectơ bit sử dụng hai byte.)
...
Phần có độ dài thay đổi của tiêu đề cũng chứa độ dài của các cột có độ dài thay đổi. Mỗi độ dài mất một hoặc hai byte, tùy thuộc vào độ dài tối đa của cột. Nếu tất cả các cột trong chỉ mục KHÔNG phải là NULL và có độ dài cố định, tiêu đề bản ghi không có phần có độ dài thay đổi
Và có, không gian lưu trữ được sử dụng thay đổi dựa trên loại bạn chọn, là cố định hoặc biến, đối chiếu và các yếu tố khác như động cơ.
MySQL đưa ra khuyến nghị về tối ưu hóa lưu trữ dữ liệu tại đây: Tối ưu hóa kích thước dữ liệu
Cập nhật
Một xem xét bổ sung với varchar và đó là bộ nhớ. Điều quan trọng trong MySQL là giới hạn kích thước của cột có chiều dài thay đổi càng nhiều càng tốt. Mặc dù cột là biến và không gian lưu trữ được sử dụng là biến, MySQL sẽ phân bổ bộ nhớ trong các khối cố định để lưu trữ giá trị. Ví dụ varchar (200) sẽ sử dụng nhiều bộ nhớ hơn varchar (5). Đây không phải là vấn đề về không gian lưu trữ, nhưng vẫn là điều cần xem xét khi xác định các cột của bạn.