Mysql
 sql >> база данни >  >> RDS >> Mysql

Разлика между VARCHAR и TEXT в MySQL

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 . Можете да прочетете повече за това тук .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вмъкна utf-8 mb4 символ (емоджи в ios5) в mysql?

  2. Как да дублирам таблица в MySQL

  3. Не може да се осъществи връзка, защото целевата машина активно я отказа (PHP / WAMP)

  4. Дали динамичните mysql заявки с избягване на sql са също толкова сигурни, колкото подготвените оператори?

  5. Размяна на стойности на колони в MySQL