Jaki jest odpowiednik varchar (max) w MySQL?
Jaki jest odpowiednik varchar (max) w MySQL?
Odpowiedzi:
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)
DEFAULT
wartość dla kolumny. Nie można tego zrobić z typami TEXT lub BLOB.
TEXT
limit długości to 64 KB. MEDIUMTEXT
limit długości to 16 M. LONGTEXT
limit długości to 4G.
varchar(max)
typu kolumny Sql Server .
TLDR; MySql nie ma równoważnej koncepcji varchar(max)
, jest to funkcja MS SQL Server.
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
, NTEXT
lub BLOB
kolumny 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
, WRITETEXT
i 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
, NTEXT
i typ kolumna obsługuje wszystkie te same semantyka zapytań jak inne rodzaje kolumn.BLOB
varchar(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)
.
Aby uzyskać taką samą ilość miejsca, jak varchar(max)
w MySql, nadal musisz uciekać się do BLOB
typu kolumny. W tym artykule omówiono bardzo skuteczną metodę efektywnego przechowywania dużych ilości danych w MySql.
varchar(max)
tak naprawdę oznacza.
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.
zmień tabelę prg_ar_report_colors add Text_Color_Code VARCHAR (max);
zmień tabelę prg_ar_report_colors add Text_Color_Code longtext;
zmień tabelę prg_ar_report_colors add Text_Color_Code CLOB;
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>