Equivalente di varchar (max) in MySQL?


Risposte:


195

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

VARCHAR(65535)

Tuttavia, si noti che il limite è inferiore se si utilizza un set di caratteri multi-byte:

VARCHAR(21844) CHARACTER SET utf8

Ecco alcuni esempi:

La dimensione massima della riga è 65535, ma un varchar include anche un byte o due 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 ridurre le lunghezze, troviamo la massima lunghezza che funziona:

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

Ora se proviamo a usare un set di caratteri multibyte a livello di tabella, scopriamo che conta ogni carattere come più byte. Le stringhe UTF8 non utilizzano necessariamente più byte per stringa, ma MySQL non può presumere che limiterai tutti i tuoi futuri inserimenti 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, InnoDB non ama 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 si calcola che 21845 * 3 = 65535, che non avrebbe funzionato comunque. Considerando 21844 * 3 = 65532, che funziona.

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

20
Suggerirei anche di usare TEXT
Adi il

2
@AdnanShammout: certo, a meno che tu non voglia dichiarare un DEFAULTvalore per la colonna. Non è possibile farlo con i tipi TEXT o BLOB.
Bill Karwin,

5
@DanW, il TEXTlimite di lunghezza è 64 KB. MEDIUMTEXTil limite di lunghezza è 16 M. LONGTEXTil limite di lunghezza è 4G.
Bill Karwin,

4
Il problema più grande con questo è che se si crea una colonna di quelle dimensioni, si può avere solo una colonna nella tabella. La dimensione della riga MAX in MySql è 64k, quindi se hai una colonna 64k, è tutto ciò che ottieni. Questo stesso vincolo non si applica al varchar(max)tipo di colonna del server SQL .
joshperry,

1
@joshperry, sì, ma le colonne TEXT / BLOB contano solo una piccola quantità (9-12 byte) per quel limite di dimensioni di riga di 64 KB, quindi se hai bisogno di un VARCHAR di grandi dimensioni e di un numero di altre colonne, è meglio usare TEXT.
Bill Karwin,

74

TLDR; MySql non ha un concetto equivalente di varchar(max), questa è una funzionalità di MS SQL Server.

Che cos'è VARCHAR (max)?

varchar(max) è una funzionalità di Microsoft SQL Server.

La quantità di dati che una colonna potrebbe archiviare nelle versioni del server Microsoft SQL precedenti alla versione 2005 era limitata a 8 KB. Per archiviare più di 8 KB dovresti usare TEXT, NTEXTo BLOBtipi di colonne, questi tipi di colonne memorizzavano i loro dati come una raccolta di pagine da 8 KB separate dalle pagine di dati della tabella; hanno supportato l'archiviazione fino a 2 GB per riga.

Il grande avvertimento per questi tipi di colonna era che di solito richiedevano funzioni e istruzioni speciali per accedere e modificare i dati (ad es READTEXT. WRITETEXT, E UPDATETEXT)

In SQL Server 2005 è varchar(max)stato introdotto per unificare i dati e le query utilizzate per recuperare e modificare i dati in colonne di grandi dimensioni. I dati per le varchar(max)colonne sono memorizzati in linea con le pagine dei dati della tabella.

Poiché i dati nella colonna MAX riempiono una pagina di dati da 8 KB, viene allocata una pagina di overflow e la pagina precedente punta ad essa formando un elenco collegato. A differenza di TEXT, NTEXTe BLOBil varchar(max)tipo di colonna supporta la stessa semantica di query degli altri tipi di colonna.

Quindi varchar(MAX)significa davvero varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)e non varchar(MAX_SIZE_OF_A_COLUMN).

MySql non ha un linguaggio equivalente.

Per ottenere la stessa quantità di spazio di archiviazione varchar(max)in MySql, dovrai comunque ricorrere a un BLOBtipo di colonna. Questo articolo illustra un metodo molto efficace per archiviare in modo efficiente grandi quantità di dati in MySql.


1
Questo ha più a che fare con SQL Server che con MySQL.
Kermit,

14
@njk Sì, ma per spiegare ciò che "l'equivalente" in MySql (o la mancanza di un equivalente in questo caso) ha reso necessario descrivere esattamente cosa significhi varchar(max) veramente .
joshperry,

29

La lunghezza massima di un varchar è

65535

diviso per la lunghezza massima in byte di un carattere nel set di caratteri su cui è impostata la colonna (es. utf8 = 3 byte, ucs2 = 2, latin1 = 1).

meno 2 byte per memorizzare la lunghezza

meno la lunghezza di tutte le altre colonne

meno 1 byte per ogni 8 colonne che sono nullable. Se la colonna è nulla / non nulla, questa viene memorizzata come un bit in un byte / byte chiamato maschera null, 1 bit per colonna che è nullable.


Mi piace il formato della tua risposta, ma sembra che manchino alcune informazioni utili che la risposta principale fornisce riguardo a set di caratteri e cose simili
Joe Phillips,

3

Per SQL Server

modifica tabella prg_ar_report_colors aggiungi Text_Color_Code VARCHAR (max);

Per MySql

alter table prg_ar_report_colors aggiungi Text_Color_Code longtext;

Per Oracle

alter table prg_ar_report_colors aggiungi Text_Color_Code CLOB;


1
si noti che longtext, text e BLOB sono memorizzati in modo diverso rispetto a varchar. varchar è memorizzato con gli altri campi, mentre il testo è archiviato in un file separato nel server. ha pro e contro così attento quale scegliere
santiago arizti

0

Mysql Conversione delle colonne da VARCHAR a TEXT quando le dimensioni sono limitate !!!

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>

-11

La lunghezza massima di un varchar in MySQL 5.6.12 è 4294967295.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.