Độ dài tối đa của varchar tùy thuộc vào kích thước hàng tối đa trong MySQL, là 64KB (không tính BLOB):
VARCHAR(65535)
Tuy nhiên, lưu ý rằng giới hạn sẽ thấp hơn nếu bạn sử dụng bộ ký tự nhiều byte:
VARCHAR(21844) CHARACTER SET utf8
Dưới đây là một số ví dụ:
Kích thước hàng tối đa là 65535, nhưng một varchar cũng bao gồm một hoặc hai byte để mã hóa độ dài của một chuỗi nhất định. Vì vậy, bạn thực sự không thể khai báo một varchar có kích thước hàng tối đa, ngay cả khi đó là cột duy nhất trong bảng.
mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Nhưng nếu chúng tôi thử giảm độ dài, chúng tôi thấy độ dài lớn nhất hoạt động:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Bây giờ nếu chúng tôi cố gắng sử dụng một bộ ký tự nhiều byte ở cấp bảng, chúng tôi thấy rằng nó tính mỗi ký tự là nhiều byte. Chuỗi UTF8 không nhất thiết phải sử dụng nhiều byte cho mỗi chuỗi, nhưng MySQL không thể cho rằng bạn sẽ giới hạn tất cả các lần chèn trong tương lai của mình thành các ký tự byte đơn.
mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead
Bất chấp những gì lỗi cuối cùng đã nói với chúng tôi, InnoDB vẫn không thích độ dài 21845.
mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
Điều này hoàn toàn hợp lý, nếu bạn tính toán rằng 21845 * 3 =65535, thì dù sao cũng sẽ không hoạt động. Trong khi 21844 * 3 =65532, hoạt động.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)