Mysql
 sql >> Database >  >> RDS >> Mysql

Equivalente di varchar(max) in MySQL?

La lunghezza massima di un varchar è soggetta alla dimensione massima della riga in MySQL, che è 64 KB (senza contare i BLOB):

VARCHAR(65535)

Tuttavia, tieni presente che il limite è inferiore se utilizzi un set di caratteri multibyte:

VARCHAR(21844) CHARACTER SET utf8

Ecco alcuni esempi:

La dimensione massima della riga è 65535, ma un varchar include anche uno o due byte per codificare la lunghezza di una determinata stringa. Quindi in realtà non puoi dichiarare un varchar della dimensione massima della riga, anche se è l'unica colonna nella tabella.

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

Ma se proviamo a diminuire le lunghezze, troviamo la lunghezza massima che funziona:

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

Ora, se proviamo a utilizzare un set di caratteri multibyte a livello di tabella, scopriamo che conta ogni carattere come più byte. Le stringhe UTF8 non necessariamente usa più byte per stringa, ma MySQL non può presumere che limiterai tutti i tuoi inserimenti futuri a caratteri a byte singolo.

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

Nonostante ciò che ci ha detto l'ultimo errore, a InnoDB non piace ancora una lunghezza di 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

Questo ha perfettamente senso, se calcoli 21845*3 =65535, che comunque non avrebbe funzionato. Considerando che 21844*3 =65532, che funziona.

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