Максимальный размер хранилища TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT

Per документы MySQL, есть четыре типа текста:

  1. TINYTEXT
  2. текст
  3. MEDIUMTEXT
  4. LONGTEXT

какова максимальная длина, которую можно хранить в столбце тип данных, предполагая, что кодировка символов UTF-8?

4 ответов


С документация :

      Type | Maximum length
-----------+-------------------------------------
  TINYTEXT |           255 (2 8−1) bytes
      TEXT |        65,535 (216−1) bytes = 64 KiB
MEDIUMTEXT |    16,777,215 (224−1) bytes = 16 MiB
  LONGTEXT | 4,294,967,295 (232−1) bytes =  4 GiB

обратите внимание, что количество символы это может быть сохранено в вашем столбце будет зависеть от кодировка.


расширение того же ответа

  1. это так сообщение : varchar(255) vs tinytext/tinyblob и varchar (65535) vs blob/text подробно описывает накладные расходы и механизмы хранения.
  2. как отмечено из пункта (1), вместо TINYTEXT всегда следует использовать VARCHAR. Однако при использовании VARCHAR максимальный размер строки не должен превышать 65535 байт.
  3. как описано здесь http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html, максимальные 3 байта для utf-8.

ЭТО ГРУБАЯ ТАБЛИЦА ОЦЕНКИ ДЛЯ БЫСТРЫХ РЕШЕНИЙ!

  1. таким образом, худшие предположения (3 байта на utf-8 char) в лучший случай (1 байт на utf-8 char)
  2. предполагая, что английский язык имеет в среднем 4,5 букв за слово
  3. x-количество байт выделено

x-x

      Type | A= worst case (x/3) | B = best case (x) | words estimate (A/4.5) - (B/4.5)
-----------+---------------------------------------------------------------------------
  TINYTEXT |              85     | 255               | 18 - 56
      TEXT |           21845     | 65,535            | 4854.44 - 14,563.33  
MEDIUMTEXT |       5,592,415     | 16,777,215        | 1,242,758.8 - 3,728,270
  LONGTEXT |   1,431,655,765     | 4,294,967,295     | 318,145,725.5 - 954,437,176.6

см. ответ Крис Ви, а также : https://stackoverflow.com/a/35785869/1881812


поднимаясь до задачи @Ankan-Zerob, это моя оценка максимальной длины, которая может быть сохранена в каждом типе текста измеряется в слова:

      Type |         Bytes | English words | Multi-byte words
-----------+---------------+---------------+-----------------
  TINYTEXT |           255 |           ±44 |              ±23
      TEXT |        65,535 |       ±11,000 |           ±5,900
MEDIUMTEXT |    16,777,215 |    ±2,800,000 |       ±1,500,000
  LONGTEXT | 4,294,967,295 |  ±740,000,000 |     ±380,000,000

на английский язык, 4,8 буквы на слово, вероятно, хорошее среднее (например,norvig.com/mayzner.html), хотя длина слова будет варьироваться в зависимости от домена (например, разговорный язык против академических работ), поэтому нет смысла быть слишком точным. Английский язык-это в основном однобайтовые символы ASCII, с очень случайные многобайтовые символы, так близко к одному байту на букву. Дополнительный символ должен быть разрешен для межсловных пространств, поэтому я округлил от 5.8 байтов на слово. В языках с большим количеством акцентов, таких как польский, будет храниться немного меньше слов, как, например, немецкий с более длинными словами.

языки, требующие мульти-байт символы, такие как греческий, арабский, иврит, хинди, тайский и т. д. обычно требуют два байта на символ в UTF-8. Дико гадать при 5 буквах на слово я округлил от 11 байт на слово.

скрипты CJK (Ханзи, Кандзи, Хирагана, катакана и т. д.) Я ничего не знаю; я считаю, что символы в основном требуют 3 байта в UTF-8, и (с массовым упрощением) они могут рассматриваться как использование около 2 символов на слово, поэтому они будут где-то между двумя другими. (Скрипты CJK, вероятно, потребуют меньше памяти с использованием UTF-16, в зависимости).

это, конечно, игнорирование накладных расходов на хранение так далее.


Это хорошо, но не отвечает на вопрос:

" вместо TINYTEXT всегда следует использовать VARCHAR."Tinytext полезен, если у вас есть широкие строки - так как данные хранятся вне записи. Есть накладные расходы на производительность, но у него есть использование.