Trong bộ nhớ, VARCHAR(255)
đủ thông minh để chỉ lưu trữ độ dài bạn cần trên một hàng nhất định, không giống như hàng CHAR(255)
sẽ luôn lưu trữ 255 ký tự.
Nhưng vì bạn đã gắn thẻ câu hỏi này với MySQL, tôi sẽ đề cập đến một mẹo dành riêng cho MySQL: khi các hàng được sao chép từ lớp công cụ lưu trữ sang lớp SQL, VARCHAR
các trường được chuyển đổi CHAR
để đạt được lợi thế khi làm việc với các hàng có chiều rộng cố định. Vì vậy, các chuỗi trong bộ nhớ trở nên được đệm bằng chiều dài tối đa của VARCHAR
cột đã khai báo của bạn .
Khi truy vấn của bạn hoàn toàn tạo ra một bảng tạm thời, chẳng hạn như trong khi sắp xếp hoặc GROUP BY
, điều này có thể sử dụng nhiều bộ nhớ. Nếu bạn sử dụng nhiều VARCHAR(255)
trường cho dữ liệu không cần quá dài, điều này có thể làm cho bảng tạm thời rất lớn.
Bạn cũng có thể muốn biết rằng hành vi "đệm ra" này có nghĩa là một chuỗi được khai báo với bộ ký tự utf8 đệm ra ba byte cho mỗi ký tự ngay cả đối với chuỗi bạn lưu trữ với nội dung một byte (ví dụ: ký tự ascii hoặc latin1). Và tương tự như vậy, bộ ký tự utf8mb4 làm cho chuỗi thêm vào bốn byte cho mỗi ký tự trong bộ nhớ.
Vì vậy, một VARCHAR(255)
trong utf8 lưu trữ một chuỗi ngắn như "Không có ý kiến" chiếm 11 byte trên đĩa (mười ký tự ký tự thấp hơn, cộng thêm một byte cho độ dài) nhưng nó chiếm 765 byte trong bộ nhớ và do đó trong bảng tạm thời hoặc kết quả được sắp xếp.
Tôi đã giúp những người dùng MySQL vô tình tạo bảng tạm thời 1,5GB thường xuyên và làm đầy không gian đĩa của họ. Họ có rất nhiều VARCHAR(255)
cột trong thực tế lưu trữ các chuỗi rất ngắn.
Tốt nhất nên xác định cột dựa trên loại dữ liệu mà bạn định lưu trữ. Nó có lợi ích để thực thi các ràng buộc liên quan đến ứng dụng, như những người khác đã đề cập. Nhưng nó có những lợi ích vật lý để tránh lãng phí bộ nhớ mà tôi đã mô tả ở trên.
Tất nhiên, thật khó để biết địa chỉ bưu điện dài nhất là gì, đó là lý do tại sao nhiều người chọn một VARCHAR
địa chỉ dài chắc chắn dài hơn bất kỳ địa chỉ nào. Và 255 là thông lệ vì nó là độ dài tối đa của a VARCHAR
mà độ dài có thể được mã hóa bằng một byte. Nó cũng là VARCHAR
độ dài tối đa trong MySQL cũ hơn 5.0.