Kích thước lưu trữ cho varchar là độ dài thực của dữ liệu được nhập + 2 byte. Mặc dù bản thân cột có chi phí 2 byte đó, bạn có thể đặt các giá trị varchar lên đến 900 byte vào một cột được lập chỉ mục.
Trong thực tế, bạn có thể tạo chỉ mục trên cột có kích thước lớn hơn 900 byte, nhưng bạn sẽ gặp sự cố nếu thực sự cố gắng chèn một cái gì đó lớn hơn 900 byte:
create table test (
col varchar(1000)
);
create index test_index on test (col);
-- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail.
insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success
insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail
-- Msg 1946, Level 16, State 3, Line 8
-- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes.
Lưu ý rằng giới hạn 900 byte bao gồm tất cả các cột của một khóa chỉ mục nhất định, như ví dụ sau cho thấy:
create table test (
col varchar(1000)
, otherCol bit -- This column will take a byte out of the index below, pun intended
);
create index test_index on test (col, otherCol);
insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success
insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail
insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail
Đối với những cột này thường quá lớn đối với một khóa chỉ mục, bạn có thể đạt được một số lợi ích của việc lập chỉ mục bằng cách đưa chúng vào một chỉ mục.