TL;DR
TEXT
- фиксиран максимален размер от 65535 знака (не можете да ограничите максималния размер)
- отнема 2 +
cбайтове дисково пространство, къдетоcе дължината на съхранения низ. - не може да бъде (напълно) част от индекс. Ще трябва да посочите дължина на префикса.
VARCHAR(M)
- променлив максимален размер на
Mсимволи Mтрябва да бъде между 1 и 65535- заема 1 +
cбайтове (заM≤ 255) или 2 +c(за 256 ≤M≤ 65535) байта дисково пространство, къдетоcе дължината на съхранения низ - може да бъде част от индекс
Още подробности
TEXT има фикснат максимален размер на 2¹⁶-1 = 65535 символи.VARCHAR има променлива максимален размер M до M = 2¹⁶-1 .
Така че не можете да изберете размера на TEXT но можете за VARCHAR .
Другата разлика е, че не можете да поставите индекс (освен индекс на пълен текст) върху TEXT колона.
Така че, ако искате да имате индекс в колоната, трябва да използвате VARCHAR . Но имайте предвид, че дължината на индекса също е ограничена, така че ако вашият VARCHAR колоната е твърде дълга, трябва да използвате само първите няколко знака от VARCHAR колона във вашия индекс (Вижте документацията за CREATE INDEX
).
Но вие също искате да използвате VARCHAR , ако знаете, че максималната дължина на възможния входен низ е само M , напр. телефонен номер или име или нещо подобно. След това можете да използвате VARCHAR(30) вместо TINYTEXT или TEXT и ако някой се опита да запази текста и на трите книги "Властелинът на пръстена" в колоната за телефонен номер, вие съхранявате само първите 30 знака :)
Редактиране: Ако текстът, който искате да съхраните в базата данни, е по-дълъг от 65535 знака, трябва да изберете MEDIUMTEXT или LONGTEXT , но внимавайте:MEDIUMTEXT съхранява низове до 16 MB, LONGTEXT до 4 GB. Ако използвате LONGTEXT и вземете данните чрез PHP (поне ако използвате mysqli без store_result ), може би ще получите грешка при разпределението на паметта, защото PHP се опитва да разпредели 4 GB памет, за да е сигурен, че целият низ може да бъде буфериран. Това може би се случва и на други езици освен PHP.
Въпреки това трябва давинагите проверете въвеждането (Твърде дълго ли е? Съдържа ли странен код?) преди съхранявайки го в базата данни.
Забележка:И за двата типа необходимото дисково пространство зависи само от дължината на съхранения низ, а не от максималната дължина.
Напр. ако използвате набора от знаци latin1 и съхранявате текста "Test" в VARCHAR(30) , VARCHAR(100) и TINYTEXT , винаги изисква 5 байта (1 байт за съхраняване на дължината на низа и 1 байт за всеки знак). Ако съхранявате същия текст в VARCHAR(2000) или TEXT колона, също ще изисква същото пространство, но в този случай ще бъде 6 байта (2 байта за съхраняване на дължината на низа и 1 байт за всеки знак).
За повече информация разгледайте документацията .
И накрая, искам да добавя известие, че и двете, TEXT и VARCHAR са типове данни с променлива дължина и затова най-вероятно минимизират пространството, от което се нуждаете, за да съхранявате данните. Но това идва с компромис за производителност. Ако имате нужда от по-добра производителност, трябва да използвате тип с фиксирана дължина като CHAR . Можете да прочетете повече за това тук
.