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

551

Per документы docs, существует четыре типа TEXT:

  • TINYTEXT
  • ТЕКСТ
  • MEDIUMTEXT
  • LONGTEXT

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

  • 23
    Взять, к примеру, тип TEXT. Он может содержать 65535 байт данных. UTF-8 содержит многобайтовые символы. Поэтому, если вы заполните поле, используя только датский символ «Ø», вы получите только 32767 символов, так как этот символ UTF-8 состоит из двух байтов. Если вы заполните его буквой «а», вы получите 65535 символов.
  • 1
    Также подумайте о том, какой тип данных лучше использовать TEXT или VARCHAR.
Теги:
innodb

4 ответа

1172
Лучший ответ

Из документации:

      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

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

  • 3
    @ Бридж Не уверен, что я понимаю, но это означает, что TINYTEXT может получить до 255 символов, я прав?
  • 7
    @ Lykos Да, хорошо - в зависимости от персонажей. Из документации: A TEXT column with a maximum length of 255 (28 – 1) characters. The effective maximum length is less if the value contains multi-byte characters. Смотрите ответ Анкана для более подробной информации.
Показать ещё 6 комментариев
162

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

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

  • Итак, самые худшие предположения (3 байта на utf-8 char) в лучшем случае (1 байт на utf-8 char)
  • Предполагая, что английский язык имеет в среднем 4,5 буквы на слово
  • 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

Обратите также внимание на ответ Криса V: https://stackoverflow.com/questions/13932750/tinytext-text-mediumtext-and-longtext-maximum-storage-sizes

  • 4
    Каково обоснование для этого «VARCHAR всегда должен использоваться вместо TINYTEXT»? Разве не было бы лучше (потому что более эффективно использовать хранилище) иногда использовать меньший TINYTEXT?
  • 24
    @vlasits прочитайте включенный SO сообщение для деталей. (1) все текстовые типы, включая крошечный текст, сохраняются как объекты вне строки, которая занимает одну служебную информацию (2) Затем на эти объекты ссылаются адреса 8 или 16 байтов. поэтому независимо от того, насколько крошечный ваш крошечный текст, вы добавляете ненужные накладные расходы, что тоже для максимального размера 255 байт. Понятно, что следует использовать varchar, который не будет иметь каких-либо из перечисленных выше издержек.
Показать ещё 5 комментариев
22

Поднимаясь к задаче @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-скрипты (Hanzi, Kanji, Hiragana, Katakana и т.д.) Я ничего не знаю; Я считаю, что в большинстве случаев для UTF-8 характерны 3 байта, и (с массивным упрощением) они могут считаться использующими около 2 символов на слово, поэтому они будут находиться где-то между двумя другими. (Сценарии CJK, вероятно, потребуют меньше хранилища с использованием UTF-16, в зависимости).

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

2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню