Maksymalna długość zmiennej zależy od maksymalnego rozmiaru wiersza w MySQL, który wynosi 64 KB (nie licząc bloków BLOB):
VARCHAR(65535)
Pamiętaj jednak, że limit jest niższy, jeśli używasz zestawu znaków wielobajtowych:
VARCHAR(21844) CHARACTER SET utf8
Oto kilka przykładów:
Maksymalny rozmiar wiersza to 65535, ale varchar zawiera również bajt lub dwa kodujące długość danego ciągu. Tak więc w rzeczywistości nie można zadeklarować zmiennej o maksymalnym rozmiarze wiersza, nawet jeśli jest to jedyna kolumna w tabeli.
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
Ale jeśli spróbujemy zmniejszyć długość, znajdziemy największą, która działa:
mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)
Teraz, jeśli spróbujemy użyć wielobajtowego zestawu znaków na poziomie tabeli, stwierdzimy, że liczy on każdy znak jako wiele bajtów. Łańcuchy UTF8 nie koniecznie używaj wielu bajtów na ciąg, ale MySQL nie może zakładać, że ograniczysz wszystkie przyszłe wstawki do znaków jednobajtowych.
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
Pomimo tego, co powiedział nam ostatni błąd, InnoDB nadal nie lubi długości 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
To ma sens, jeśli obliczysz, że 21845*3 =65535, co i tak by nie zadziałało. Podczas gdy 21844*3 =65532, co działa.
mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)