Jaki jest maksymalny rozmiar MySQL VARCHAR?

300

Chciałbym wiedzieć, jaki jest maksymalny rozmiar dla typu VARCHAR MySQL.

Czytałem, że maksymalny rozmiar jest ograniczony rozmiarem wiersza, który wynosi około 65 tys. Próbowałem ustawić pole na, varchar(20000)ale mówi, że to jest zbyt duże.

Mógłbym to ustawić varchar(10000). Na ile dokładnie mogę to ustawić?

użytkownik1832628
źródło
1
Szczegółowy blog: goo.gl/Hli6G3
Suresh Kamrushi

Odpowiedzi:

293

Pamiętaj, że MySQL ma maksymalny limit wielkości wiersza

Wewnętrzna reprezentacja tabeli MySQL ma maksymalny rozmiar wiersza 65 535 bajtów, nie licząc typów BLOB i TEXT. Kolumny BLOB i TEKST przyczyniają się tylko od 9 do 12 bajtów w kierunku limitu wielkości wiersza, ponieważ ich zawartość jest przechowywana oddzielnie od reszty wiersza. Dowiedz się więcej o limitach liczby kolumn w tabeli i wielkości wiersza.

Maksymalny rozmiar, jaki może zajmować pojedyncza kolumna, jest różny przed i po MySQL 5.0.3

Wartości w kolumnach VARCHAR są łańcuchami o zmiennej długości. Długość można określić jako wartość od 0 do 255 przed MySQL 5.0.3 i od 0 do 65 535 w 5.0.3 i późniejszych wersjach. Efektywna maksymalna długość VARCHAR w MySQL 5.0.3 i nowszych zależy od maksymalnego rozmiaru wiersza (65 535 bajtów, który jest współużytkowany przez wszystkie kolumny) i użytego zestawu znaków.

Pamiętaj jednak, że limit jest niższy, jeśli używasz wielobajtowego zestawu znaków, takiego jak utf8 lub utf8mb4.

Użyj TEXTtypów inorder, aby pokonać limit wielkości wiersza.

Cztery typy TEKSTU to TINYTEXT, TEXT, MEDIUMTEXT i LONGTEXT. Odpowiadają one czterem typom BLOB i mają takie same maksymalne długości i wymagania dotyczące przechowywania.

Więcej informacji na temat typów BLOB i TEKSTOWYCH

Nawet więcej

Zamówienie więcej szczegółów na typ Przechowywanie danych Wymagania która zajmuje się wymagań magazynowych dla wszystkich typów danych.

rajukoyilandy
źródło
4
co to jest „długi” ciąg?
Richard H
6
Staram się jednak unikać kolumn TEKSTOWYCH, ponieważ mogą one powodować tworzenie tabel tymczasowych podczas ich obecności i sortowania
Robert Swisher
1
Jeśli wezmę varchar (200) na imię i przechowuję tylko 6 znaków w tym polu, to ile bajtów będzie zajmowało imię?
Paresh Gami,
2
@PareshGami - 6 + 1 = 7 znaków! W przeciwieństwie do CHAR, wartości VARCHAR są przechowywane jako 1-bajtowy lub 2-bajtowy prefiks plus dane. więcej ...
rajukoyilandy,
58

Zgodnie z dokumentami online istnieje limit 64 KB wierszy i możesz ustalić rozmiar wiersza, używając:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Należy pamiętać, że długości kolumn nie są odwzorowaniem ich wielkości jeden na jeden. Na przykład CHAR(10) CHARACTER SET utf8wymaga trzech bajtów na każdy z dziesięciu znaków, ponieważ to konkretne kodowanie musi uwzględniać właściwość trzech bajtów na znak utf8(to kodowanie MySQLutf8 zamiast „prawdziwego” UTF-8, które może mieć do czterech bajtów ).

Ale jeśli rozmiar wiersza zbliża się do 64 KB, warto sprawdzić schemat bazy danych. Jest to rzadka tabela, która musi być tak szeroka w prawidłowo skonfigurowanej bazie danych (3NF) - jest to możliwe, po prostu niezbyt częste.

Jeśli chcesz użyć więcej, możesz użyć BLOBlub TEXT. Nie liczą się one do limitu 64 KB wiersza (innego niż mały ślad administracyjny), ale musisz zdawać sobie sprawę z innych problemów, które wynikają z ich użycia, takich jak niemożność sortowania przy użyciu całego bloku tekstu poza określoną liczbą znaków (chociaż można to ustawić w górę), zmuszając tabele tymczasowe do umieszczenia na dysku zamiast w pamięci lub konieczności skonfigurowania buforów komunikacyjnych klienta i serwera, aby efektywnie obsługiwać rozmiary.

Dopuszczalne rozmiary to:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Nadal masz niedopasowanie bajtów / znaków (dzięki czemu MEDIUMTEXT utf8kolumna może przechowywać „tylko” około pół miliona znaków (16M-1)/3 = 5,592,405), ale nadal znacznie rozszerza twój zasięg.

paxdiablo
źródło
4
Należy pamiętać, że typy TEKSTOWE NIE są w stanie przechowywać w tabelach pamięci, dlatego stosowanie ich, gdy wystarczy VARCHAR, wiąże się z poważnym spadkiem wydajności.
Camden S.
„właściwość trzy bajty na znak utf8” MySql utf8 , która w rzeczywistości nie jest utf8. W rzeczywistości maks. bajty w znaku utf-8 to 4 . Z tego powodu należy zawsze ustawić kodowanie na utf8mb4MySQL . utf8mb4to nazwa MySql tego, co reszta słowa nazywa utf8.
Stijn de Witt
1
@StijndeWitt, dzięki za to. wyjaśniono, aby wskazać, że miałem na myśli metodę kodowania utf8 MySQL zamiast UTF-8. Ogólnie używam wariantu pisanego wielką literą, aby wskazać „prawdziwy” UTF-8, ponieważ jest to przyjęta konwencja IANA.
paxdiablo
41

Źródło

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

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

ZESTAW ZNAKÓW VARCHAR (21844) utf8

Attila
źródło
20
Przestań używać CHARACTER SET utf8w przykładach. Powinno tak być CHARACTER SET utf8mb4(jeśli chcesz, aby cały tekst Unicode był poprawnie przechowywany ... a kto tego nie chce?)
Stijn de Witt
4
Do CHARSET=utf8mb4użytku VARCHAR(16383).
Wil Moore III
3
Użycie utf8mb4 spowoduje przekroczenie limitu szerokości indeksu w sytuacji, gdy utf8 nie. Jeśli przyjrzysz się zestawom znaków, które są zawarte w utf8mb4, ale nie w utf8, może się okazać, że włączenie wszystkich różnych form hieroglifów i innych takich tajemnych zestawów znaków nie jest warte znacznej obniżki wydajności (ustalonej empirycznie). Nie jest tak pokrojony i wysuszony, jak sugeruje Stijn.
kcrossen
Wiele emotikonów jest również obecnych w utf8mb4 i brakuje ich w utf8, więc może to zmienić równanie, czy warto.
Brian Morearty
23

Z dokumentacji MySQL:

Efektywna maksymalna długość VARCHAR w MySQL 5.0.3 i nowszych zależy od maksymalnego rozmiaru wiersza (65 535 bajtów, który jest współużytkowany przez wszystkie kolumny) i użytego zestawu znaków. Na przykład znaki utf8 mogą wymagać do trzech bajtów na znak, więc kolumna VARCHAR, która używa zestawu znaków utf8, może zostać zadeklarowana jako maksymalnie 21 844 znaków.

Limity dla VARCHAR różnią się w zależności od użytego zestawu znaków. Użycie ASCII wymagałoby użycia 1 bajtu na znak. Oznacza to, że możesz przechowywać 65 535 znaków. Użycie utf8 spowoduje użycie 3 bajtów na znak, co spowoduje ograniczenie liczby znaków do 21 844. ALE jeśli używasz nowoczesnego zestawu znaków wielobajtowych utf8mb4, którego powinieneś użyć! Obsługuje emoji i inne znaki specjalne. Będzie używać 4 bajtów na znak. Ograniczy to liczbę znaków na tabelę do 16 383. Pamiętaj, że inne pola, takie jak INT, również zostaną policzone do tych limitów.

Wniosek:

utf8 maksymalnie 21 844 znaków

utf8mb4 maksymalnie 16 383 znaków

Firze
źródło
6

możesz także użyć MEDIUMBLOB / LONGBLOB lub MEDIUMTEXT / LONGTEXT

Typ BLOB w MySQL może przechowywać do 65 534 bajtów, jeśli spróbujesz zapisać więcej niż tyle danych, MySQL skróci dane. MEDIUMBLOB może przechowywać do 16 777 213 bajtów, a LONGBLOB może przechowywać do 4 294 967 292 bajtów.

SRIRAM
źródło
3

Przed wersją Mysql 5.0.3 typ danych Varchar może przechowywać 255 znaków, ale od 5.0.3 może przechowywać 65 535 znaków.

ALE ma ograniczenie maksymalnej wielkości wiersza 65 535 bajtów. Oznacza to, że uwzględnienie wszystkich kolumn nie może przekraczać 65 535 bajtów.

W twoim przypadku może się zdarzyć, że gdy spróbujesz ustawić więcej niż 10000, przekroczy on więcej niż 65 535, a mysql wyświetli błąd.

Po więcej informacji: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog z przykładem: http://goo.gl/Hli6G3

Suresh Kamrushi
źródło
-5

Możesz użyć TEXTtypu , który nie jest ograniczony do 64 KB.

mvp
źródło
31
To nie odpowiada na pytanie.
DreamWave,
1
Twoja odpowiedź nie dotyczy pytania.
Girish