web-dev-qa-db-fra.com

Équivalent de varchar (max) dans MySQL?

Quel est l'équivalent de varchar (max) dans MySQL?

159
David Basarab

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

VARCHAR(65535)

Toutefois, 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 65535, mais varchar inclut également un octet ou deux 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 de la table.

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 réduire 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 n'utilisent pas nécessairement plusieurs octets par chaîne, mais MySQL ne peut pas supposer que vous limiterez toutes vos insertions ultérieures à 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 nous a dit la dernière erreur, 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, cela fonctionne.

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

Qu'est-ce que VARCHAR (max)?

varchar(max) est une fonctionnalité de Microsoft SQL Server.

La quantité de données qu'une colonne pouvait stocker dans les versions de Microsoft SQL Server antérieures à la version 2005 était limitée à 8 Ko. Pour stocker plus de 8 Ko, vous auriez dû utiliser les types de colonnes TEXT, NTEXT ou BLOB, ces types de colonnes stockaient leurs données sous la forme d'une collection de pages séparées de la pages de données de table; ils ont soutenu stocker jusqu'à 2 Go par ligne.

Le gros inconvénient de ces types de colonne était qu'ils nécessitaient généralement des fonctions et des instructions spéciales pour accéder aux données et les modifier (par exemple, READTEXT, WRITETEXT et UPDATETEXT).

Dans SQL Server 2005, varchar(max) a été introduit pour unifier les données et les requêtes utilisées pour extraire et modifier les données dans des colonnes de grande taille. Les données pour les colonnes varchar(max) sont stockées en ligne avec les pages de données du tableau.

Au fur et à mesure que les données de la colonne MAX remplissent une page de données de 8 Ko, une page de dépassement de capacité est allouée et la page précédente pointe vers une liste liée. Contrairement à TEXT, NTEXT et BLOB, le type de colonne varchar(max) prend en charge la même sémantique de requête que les autres types de colonnes.

Donc, varchar(MAX) signifie réellement varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING) et non varchar(MAX_SIZE_OF_A_COLUMN).

MySql n'a pas un idiome équivalent.

Pour obtenir le même espace de stockage qu'un varchar(max) dans MySql, vous devez toujours recourir à un type de colonne BLOB. Cet article discute d’une méthode très efficace pour stocker efficacement de grandes quantités de données dans MySql.

72
joshperry

La longueur maximale d'un varchar est

65535

divisé par la longueur maximale d'octets d'un caractère du jeu de caractères dans lequel la colonne est définie (par exemple, utf8 = 3 octets, ucs2 = 2, latin1 = 1).

moins 2 octets pour stocker la longueur

moins la longueur de toutes les autres colonnes

moins 1 octet pour 8 colonnes nullables. Si votre colonne est null/not null, elle est stockée sous la forme d'un bit dans un octet/octets appelé masque NULL, un bit par colonne pouvant être mis à zéro.

27
ʞɔıu

Pour SQL Server

modifier la table prg_ar_report_colors add Text_Color_Code VARCHAR (max);

Pour MySql

alter table prg_ar_report_colors add Text_Color_Code longtext;

Pour Oracle

alter table prg_ar_report_colors add Text_Color_Code CLOB;

3
Dinanath Parit

Mysql Conversion de colonne de VARCHAR en TEXT lorsque la taille limite est inférieure !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>
0
zloctb