Mysql
 sql >> Base de données >  >> RDS >> Mysql

Équivalent de varchar(max) dans MySQL ?

La longueur maximale d'un varchar est soumise à la taille de ligne maximale dans MySQL, qui est de 64 Ko (sans compter les BLOB) :

VARCHAR(65535)

Cependant, notez que la limite est inférieure si vous utilisez un jeu de caractères multi-octets :

VARCHAR(21844) CHARACTER SET utf8

Voici quelques exemples :

La taille de ligne maximale est de 65 535, mais un varchar inclut également un ou deux octets pour coder la longueur d'une chaîne donnée. Vous ne pouvez donc pas déclarer un varchar de la taille de ligne maximale, même s'il s'agit de la seule colonne du tableau.

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

Mais si nous essayons de diminuer les longueurs, nous trouvons la plus grande longueur qui fonctionne :

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Maintenant, si nous essayons d'utiliser un jeu de caractères multi-octets au niveau de la table, nous constatons qu'il compte chaque caractère comme plusieurs octets. Les chaînes UTF8 ne sont pas nécessairement utilisez plusieurs octets par chaîne, mais MySQL ne peut pas supposer que vous limiterez toutes vos futures insertions à des caractères à un octet.

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

Malgré ce que la dernière erreur nous a dit, InnoDB n'aime toujours pas une longueur de 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

Cela est parfaitement logique, si vous calculez que 21845*3 =65535, ce qui n'aurait pas fonctionné de toute façon. Alors que 21844*3 =65532, ce qui fonctionne.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)