Echivalentul lui varchar(max) în MySQL? (Programare, Mysql, Varchar)

David Basarab a intrebat.

Care este echivalentul lui varchar(max) în MySQL?

6 răspunsuri
Bill Karwin

Lungimea maximă a unui varchar este supusă dimensiunii maxime a rândului în MySQL, care este de 64KB (fără a lua în considerare BLOB-urile):

VARCHAR(65535)

Cu toate acestea, rețineți că limita este mai mică dacă utilizați un set de caractere multibyte:

VARCHAR(21844) CHARACTER SET utf8

Iată câteva exemple:

Dimensiunea maximă a rândului este de 65535, dar un varchar include și un octet sau doi pentru a codifica lungimea unui anumit șir de caractere. Deci, de fapt, nu puteți declara un varchar cu dimensiunea maximă a rândului, chiar dacă este singura coloană din tabel.

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

Dar dacă încercăm lungimi descrescătoare, găsim cea mai mare lungime care funcționează:

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

Acum, dacă încercăm să folosim un set de caractere multibyte la nivelul tabelului, constatăm că fiecare caracter este considerat mai mulți octeți. Șirurile UTF8 nu neapărat utilizează mai mulți octeți pe șir, dar MySQL nu poate presupune că veți limita toate inserțiile viitoare la caractere cu un singur 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

În ciuda a ceea ce ne-a spus ultima eroare, lui InnoDB tot nu-i place o lungime 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

Acest lucru este perfect logic, dacă calculați că 21845*3 = 65535, ceea ce oricum nu ar fi funcționat. În timp ce 21844*3 = 65532, care funcționează.

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

Comentarii

    22

  • Aș sugera, de asemenea, să folosiți TEXT –  > Por Adi.
  • @AdnanShammout: Sigur, cu excepția cazului în care doriți să declarați un DEFAULT valoare pentru coloană. Nu se poate face acest lucru cu tipurile TEXT sau BLOB. –  > Por Bill Karwin.
  • @DanW, TEXT limita de lungime este de 64K. MEDIUMTEXT limita de lungime este de 16M. LONGTEXT limita de lungime este 4G. –  > Por Bill Karwin.
  • Cea mai mare problemă cu acest lucru este că, dacă creați o coloană de această dimensiune, puteți avea doar acea una coloană în tabel. Site-ul MAX a rândurilor în MySql este de 64k, deci dacă aveți o coloană de 64k, asta este tot ce veți obține. Aceeași constrângere nu se aplică în cazul aplicației Sql Server varchar(max) tip de coloană. –  > Por joshperry.
  • @joshperry, da, dar coloanele TEXT/BLOB contează doar o cantitate mică (9-12 octeți) pentru limita de dimensiune a rândului de 64 KB, așa că, dacă aveți nevoie de un VARCHAR mare, precum și de un număr de alte coloane, este mai bine să folosiți TEXT. –  > Por Bill Karwin.
joshperry

TLDR; MySql nu are un concept echivalent de varchar(max), , aceasta este o caracteristică a MS SQL Server.

Ce este VARCHAR(max)?

varchar(max) este o caracteristică a Microsoft SQL Server.

Cantitatea de date pe care o coloană o putea stoca în versiunile Microsoft SQL Server anterioare versiunii 2005 era limitată la 8KB. Pentru a stoca mai mult de 8KB ar trebui să utilizați TEXT, , NTEXT, , sau BLOB aceste tipuri de coloane își stocau datele ca o colecție de pagini de 8K separate de paginile de date ale tabelei; acestea suportau stocarea a până la 2GB pe rând.

Marele avertisment al acestor tipuri de coloane era că, de obicei, necesitau funcții și instrucțiuni speciale pentru a accesa și modifica datele (de ex. READTEXT, , WRITETEXT, , și UPDATETEXT)

În SQL Server 2005, varchar(max) a fost introdus pentru a unifica datele și interogările utilizate pentru a prelua și modifica datele din coloanele mari. Datele pentru varchar(max) coloane sunt stocate în linie cu paginile de date ale tabelelor.

Pe măsură ce datele din coloana MAX umple o pagină de date de 8 KB, este alocată o pagină de depășire, iar pagina anterioară indică această pagină, formând o listă legată. Spre deosebire de TEXT, , NTEXT, , și BLOB varchar(max) tipul de coloană suportă aceeași semantică de interogare ca și alte tipuri de coloane.

Deci varchar(MAX) înseamnă de fapt varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING) și nu varchar(MAX_SIZE_OF_A_COLUMN).

MySql nu are un idiom echivalent.

Pentru a obține aceeași cantitate de spațiu de stocare ca și un fișier varchar(max) în MySql, ar trebui să recurgeți la un fișier BLOB tip de coloană. Acest articol discută o metodă foarte eficientă de stocare eficientă a unor cantități mari de date în MySql.

Comentarii

  • Aceasta are mai mult de-a face cu SQL Server decât cu MySQL. –  > Por Kermit.
  • 17

  • @njk Da, dar pentru a explica ce înseamnă „echivalentul” în MySql (sau lipsa unui echivalent în acest caz) a fost nevoie să se descrie exact ce varchar(max) de fapt înseamnă. –  > Por joshperry.
ʞɔɔıu

Lungimea maximă a unui varchar este

65535

împărțită la lungimea maximă de octeți a unui caracter din setul de caractere pe care este setată coloana (de exemplu, utf8=3 octeți, ucs2=2, latin1=1).

minus 2 octeți pentru a stoca lungimea

minus lungimea tuturor celorlalte coloane

minus 1 octet pentru fiecare 8 coloane care pot fi anulate. În cazul în care coloana este nulă/nu este nulă, acest lucru se stochează ca un bit într-un octet/octeți numit(e) mască de nul, 1 bit pentru fiecare coloană care poate fi nulă.

Comentarii

  • Îmi place formatul răspunsului dvs., dar se pare că lipsesc unele informații utile pe care răspunsul de sus le oferă în ceea ce privește seturile de caractere și altele –  > Por Joe Phillips.
Dinanath Parit

Pentru Sql Server

alter table prg_ar_report_colors add Text_Color_Code VARCHAR(max);

Pentru MySql

alter table prg_ar_report_colors add Text_Color_Code longtext;

Pentru Oracle

alter table prg_ar_report_colors add Text_Color_Code CLOB;

Comentarii

  • rețineți că longtext, text și blob sunt stocate diferit față de varchar. varchar este stocat împreună cu celelalte câmpuri, în timp ce text este stocat într-un fișier separat pe server. are avantaje și dezavantaje, așa că aveți grijă pe care îl alegeți –  > Por santiago arizti.
zloctb

Mysql Conversia coloanei din VARCHAR în TEXT atunci când este sub dimensiunea limită!!!!

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>

ajabep

Lungimea maximă a unui varchar în MySQL 5.6.12 este 4294967295.