Câu trả lời ngắn: Không thực tế, hiệu suất, hoặc lưu trữ, sự khác biệt.
Câu trả lời dài:
Về cơ bản không có sự khác biệt (trong MySQL) giữa VARCHAR(3000)
(hoặc bất kỳ giới hạn lớn nào khác) và TEXT
. Cái trước sẽ cắt ngắn ở 3000 ký tự ; cái sau sẽ cắt ở 65535 byte . (Tôi phân biệt giữa byte và ký tự vì một ký tự có thể lấy nhiều byte.)
Đối với các giới hạn nhỏ hơn VARCHAR
, có một số lợi thế hơn TEXT
.
- "nhỏ hơn" có nghĩa là 191, 255, 512, 767 hoặc 3072, v.v., tùy thuộc vào phiên bản, ngữ cảnh và
CHARACTER SET
.
INDEXes
bị giới hạn về mức độ lớn của một cột có thể được lập chỉ mục. (767 hoặc 3072 byte ; đây là phiên bản và cài đặt phụ thuộc)
- Các bảng trung gian được tạo bởi phức
SELECTs
được xử lý theo hai cách khác nhau - NHỚ (nhanh hơn) hoặc MyISAM (chậm hơn). Khi các cột 'lớn' được tham gia, kỹ thuật chậm hơn sẽ tự động được chọn. (Những thay đổi đáng kể trong phiên bản 8.0; vì vậy mục đạn này có thể thay đổi.)
- Liên quan đến mục trước đó, tất cả các
TEXT
kiểu dữ liệu (trái ngược với VARCHAR
) nhảy thẳng đến MyISAM. Đó là, TINYTEXT
tự động tệ hơn cho các bảng tạm thời được tạo ra so với các bảng tương đương VARCHAR
. (Nhưng điều này sẽ thảo luận theo hướng thứ ba!)
VARBINARY
là như thế VARCHAR
; BLOB
cũng giống như TEXT
.
Từ chối các câu trả lời khác
Câu hỏi ban đầu hỏi một điều (sử dụng kiểu dữ liệu nào); câu trả lời được chấp nhận đã trả lời một cái gì đó khác (lưu trữ ngoài bản ghi). Câu trả lời đó đã hết hạn.
Khi chủ đề này được bắt đầu và trả lời, chỉ có hai "định dạng hàng" trong InnoDB. Ngay sau đó, hai định dạng ( DYNAMIC
và COMPRESSED
) đã được giới thiệu.
Vị trí lưu trữ cho TEXT
và VARCHAR()
dựa trên kích thước , không phải tên của kiểu dữ liệu . Để thảo luận cập nhật về lưu trữ trên / ngoài bản ghi của các cột văn bản / blob lớn, hãy xem phần này .