Equivalent de varchar (max) dans MySQL?

170

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

David Basarab
la source

Réponses:

195

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 65535, mais un varchar comprend é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 si c'est 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 restreindrez 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)
Bill Karwin
la source
20
Je suggère également d'utiliser TEXT
Adi
2
@AdnanShammout: Bien sûr, à moins que vous ne souhaitiez déclarer une DEFAULTvaleur pour la colonne. Impossible de faire cela avec les types TEXT ou BLOB.
Bill Karwin le
5
@DanW, la TEXTlimite de longueur est de 64 Ko. MEDIUMTEXTla limite de longueur est de 16M. LONGTEXTla limite de longueur est de 4G.
Bill Karwin
4
Le plus gros problème avec ceci est que si vous créez une colonne de cette taille, vous ne pouvez avoir qu'une seule colonne dans votre tableau. La taille de ligne MAX dans MySql est de 64 Ko, donc si vous avez une colonne de 64 Ko, c'est tout ce que vous obtenez. Cette même contrainte ne s'applique pas au varchar(max)type de colonne de Sql Server .
joshperry
1
@joshperry, oui mais les colonnes TEXT / BLOB ne comptent qu'une petite quantité (9-12 octets) par rapport à cette limite de taille de ligne de 64 Ko, donc si vous avez besoin d'un grand VARCHAR ainsi que d'un certain nombre d'autres colonnes, il est préférable d'utiliser TEXT.
Bill Karwin
74

TLDR; MySql n'a pas de concept équivalent de varchar(max), il s'agit d'une fonctionnalité MS SQL Server.

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 serveur Microsoft SQL antérieures à la version 2005 était limitée à 8 Ko. Afin de stocker plus de 8 Ko , vous devez utiliser TEXT, NTEXTou BLOBtypes de colonnes, ces types de colonnes stockés leurs données comme une collection de pages 8K séparées des pages de données de table; ils ont pris en charge le stockage jusqu'à 2 Go par ligne.

La grande mise en garde à ces types de colonne était qu'ils fonctions spéciales habituellement nécessaires et les déclarations d'accès et de rectification des données (par exemple READTEXT, WRITETEXTet UPDATETEXT)

Dans SQL Server 2005, a varchar(max)été introduit pour unifier les données et les requêtes utilisées pour récupérer et modifier les données dans de grandes colonnes. Les données des varchar(max)colonnes sont stockées en ligne avec les pages de données de table.

Lorsque les données de la colonne MAX remplissent une page de données de 8 Ko, une page de débordement est allouée et la page précédente pointe vers elle en formant une liste liée. Contrairement à TEXT, NTEXTet BLOBle varchar(max)type de colonne prend en charge la même sémantique de requête que les autres types de colonne.

Donc varchar(MAX)vraiment signifie 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 d'idiome équivalent.

Afin d'obtenir la même quantité de stockage que varchar(max)dans MySql, vous devez toujours recourir à un BLOBtype de colonne. Cet article décrit une méthode très efficace pour stocker efficacement de grandes quantités de données dans MySql.

Joshperry
la source
1
Cela a plus à voir avec SQL Server qu'avec MySQL.
Kermit
14
@njk Oui, mais pour expliquer ce que «l'équivalent» dans MySql (ou l'absence d'équivalent dans ce cas) nécessitait de décrire exactement ce que signifie varchar(max) réellement .
joshperry
29

La longueur maximale d'un varchar est

65535

divisé par la longueur maximale en octets d'un caractère dans le jeu de caractères sur 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 qui peuvent être nulles. Si votre colonne est nulle / non nulle, celle-ci est stockée sous la forme d'un bit dans un octet / octets appelé masque nul, 1 bit par colonne qui est nullable.

ʞɔıu
la source
J'aime le format de votre réponse, mais il semble qu'il manque des informations utiles que la réponse principale fournit concernant les jeux de caractères et autres
Joe Phillips
3

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;

Dinanath Parit
la source
1
notez que le texte long, le texte et le blob sont stockés différemment de varchar. varchar est stocké avec les autres champs, tandis que le texte est stocké dans un fichier séparé sur le serveur. il a des avantages et des inconvénients, alors
faites
0

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

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>
zloctb
la source
-11

La longueur maximale d'un varchar dans MySQL 5.6.12 est 4294967295.

Ajabep
la source