Odpowiednik varchar (max) w MySQL?

170

Jaki jest odpowiednik varchar (max) w MySQL?

David Basarab
źródło

Odpowiedzi:

195

Maksymalna długość varchar zależy od maksymalnego rozmiaru wiersza w MySQL, który wynosi 64 KB (nie licząc bloków BLOB):

VARCHAR(65535)

Pamiętaj jednak, że limit jest niższy, jeśli używasz zestawu znaków wielobajtowych:

VARCHAR(21844) CHARACTER SET utf8

Oto kilka przykładów:

Maksymalny rozmiar wiersza to 65535, ale varchar zawiera również bajt lub dwa do zakodowania długości danego ciągu. Więc właściwie nie możesz zadeklarować varchar o maksymalnym rozmiarze wiersza, nawet jeśli jest to jedyna kolumna w tabeli.

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

Ale jeśli spróbujemy zmniejszyć długości, znajdziemy największą, która działa:

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

Teraz, jeśli spróbujemy użyć wielobajtowego zestawu znaków na poziomie tabeli, okaże się, że liczy on każdy znak jako wiele bajtów. Łańcuchy UTF8 niekoniecznie używają wielu bajtów na ciąg, ale MySQL nie może zakładać, że ograniczysz wszystkie przyszłe wstawienia do znaków jednobajtowych.

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

Pomimo tego, co powiedział nam ostatni błąd, InnoDB nadal nie lubi długości 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

Ma to sens, jeśli obliczysz, że 21845 * 3 = 65535, co i tak nie zadziałałoby. Podczas gdy 21844 * 3 = 65532, co działa.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
Bill Karwin
źródło
20
Sugerowałbym również użycie TEKSTU
Adi
2
@AdnanShammout: Jasne, chyba że chcesz zadeklarować DEFAULTwartość dla kolumny. Nie można tego zrobić z typami TEXT lub BLOB.
Bill Karwin
5
@DanW, TEXTlimit długości to 64 KB. MEDIUMTEXTlimit długości to 16 M. LONGTEXTlimit długości to 4G.
Bill Karwin
4
Największym problemem jest to, że jeśli utworzysz kolumnę o tym rozmiarze, możesz mieć tylko tę jedną kolumnę w swojej tabeli. MAX wielkość wiersza w MySQL jest 64k, więc jeśli masz kolumnę 64 KB, to wszystko można dostać. To samo ograniczenie nie dotyczy varchar(max)typu kolumny Sql Server .
joshperry
1
@joshperry, tak, ale kolumny TEXT / BLOB liczą tylko niewielką ilość (9-12 bajtów) do tego limitu rozmiaru wiersza 64KB, więc jeśli potrzebujesz dużego VARCHAR, a także wielu innych kolumn, lepiej użyć TEXT.
Bill Karwin
74

TLDR; MySql nie ma równoważnej koncepcji varchar(max), jest to funkcja MS SQL Server.

Co to jest VARCHAR (max)?

varchar(max) jest funkcją programu Microsoft SQL Server.

Ilość danych, które kolumna mogła przechowywać w wersjach serwera Microsoft SQL starszych niż wersja 2005, była ograniczona do 8 KB. W celu zapisania więcej niż 8KB trzeba by użyć TEXT, NTEXTlub BLOBkolumny typy te typy kolumn przechowywane swoje dane jako zbiór 8K stronach oddzielone od stron danych tabeli; Obsługiwali przechowywanie do 2 GB na wiersz.

Dużą zastrzeżenie do tych typów kolumn było to, że zazwyczaj wymaga specjalnych funkcji i oświadczenia do dostępu i modyfikacji danych (np READTEXT, WRITETEXTi UPDATETEXT)

W SQL Server 2005 varchar(max)wprowadzono ujednolicenie danych i zapytań używanych do pobierania i modyfikowania danych w dużych kolumnach. Dane dla varchar(max)kolumn są przechowywane razem ze stronami danych tabeli.

Gdy dane w kolumnie MAX wypełniają stronę danych o rozmiarze 8 KB, zostaje przydzielona strona przepełniona, a poprzednia strona wskazuje na nią, tworząc połączoną listę. W przeciwieństwie TEXT, NTEXTi typ kolumna obsługuje wszystkie te same semantyka zapytań jak inne rodzaje kolumn.BLOBvarchar(max)

Więc varchar(MAX)naprawdę znaczy, varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)a nie varchar(MAX_SIZE_OF_A_COLUMN).

MySql nie ma odpowiednika idiomu.

Aby uzyskać taką samą ilość miejsca, jak varchar(max)w MySql, nadal musisz uciekać się do BLOBtypu kolumny. W tym artykule omówiono bardzo skuteczną metodę efektywnego przechowywania dużych ilości danych w MySql.

joshperry
źródło
1
Ma to więcej wspólnego z SQL Server niż MySQL.
Kermit,
14
@njk Tak, ale aby wyjaśnić, co „odpowiednik” w MySql (lub brak odpowiednika w tym przypadku) wymagał dokładnego opisania, co varchar(max) tak naprawdę oznacza.
joshperry,
29

Maksymalna długość varchar to

65535

podzielone przez maksymalną długość bajtu znaku w zestawie znaków, na który ustawiana jest kolumna (np. utf8 = 3 bajty, ucs2 = 2, latin1 = 1).

minus 2 bajty do przechowywania długości

minus długość wszystkich pozostałych kolumn

minus 1 bajt na każde 8 kolumn, które mają wartość null. Jeśli twoja kolumna ma wartość null / not null, zostanie ona zapisana jako jeden bit w bajcie / bajtach zwanym maską zerową, 1 bit na kolumnę, która jest dopuszczalna wartości null.

ʞɔıu
źródło
I jak formacie odpowiedź, ale wydaje się, że brakuje kilka przydatnych informacji, że górna odpowiedź zapewnia dotyczące zestawów znaków i rzeczy
Joe Phillips
3

Dla Sql Server

zmień tabelę prg_ar_report_colors add Text_Color_Code VARCHAR (max);

Dla MySql

zmień tabelę prg_ar_report_colors add Text_Color_Code longtext;

Dla Oracle

zmień tabelę prg_ar_report_colors add Text_Color_Code CLOB;

Dinanath Parit
źródło
1
zwróć uwagę, że longtext, text i blob są przechowywane inaczej niż varchar. varchar jest przechowywany z innymi polami, podczas gdy tekst jest przechowywany w osobnym pliku na serwerze. ma wady i zalety, więc uważaj, który z nich wybrać
santiago arizti
0

MySQL Konwertowanie kolumny z VARCHAR na TEXT, gdy rozmiar jest poniżej limitu !!!

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
źródło
-11

Maksymalna długość varchar w MySQL 5.6.12 to 4294967295.

ajabep
źródło