Максимальні розміри пам’яті TINYTEXT, TEXT, MEDIUMTEXT і LONGTEXT


796

За MySQL в документації , існує чотири типи TEXT:

  1. TINYTEXT
  2. ТЕКСТ
  3. MEDIUMTEXT
  4. ДОВГОТЕКСТ

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


26
Візьмемо для прикладу тип ТЕКСТУ. Він може містити 65535 байт даних. UTF-8 містить багатобайтові символи. Тому, якщо ви заповнили поле, використовуючи лише датський символ "Ø", ви отримаєте лише 32767 символів, оскільки цей символ UTF-8 складається з двох байтів. Якщо ви заповнили його "a", ви отримаєте 65535 символів.
Ендрю Планк

Відповіді:


1518

З документації :

      Тип | Максимальна довжина
----------- + -------------------------------------
  TINYTEXT | 255 (2 8 -1) байт
      ТЕКСТ | 65,535 (2 16 -1) байт = 64 KiB
MEDIUMTEXT | 16,777,215 (2 24 −1) байт = 16 МіБ
  ДОВГОТЕКСТ | 4,294,967,295 (2 32 −1) байт = 4 ГіБ

Зауважте, що кількість символів, які можна зберегти у вашому стовпці, залежатиме від кодування символів .


3
@Bridge Не впевнений, що я розумію, але це означає, що TINYTEXT може набрати до 255 символів, я правий ???
ltdev

9
@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.Дивіться відповідь Анкана для більш детальної інформації.
Міст

4
@ aurel.g Ось як ви справді відповідаєте на питання. І я погоджуюся з Крістофе, саме так mySQL повинен представляти його параметри - навіть якщо це лише додаткова стенограма до їх ... затаємного перегляду тексту.
cbmtrx

1
Можливо, варто додати, що порядок масштабування символу становить пару байт (мінімум 1, я думаю). Таким чином, можна зберігати 10 000-50 000 символів у колонці ТЕКСТ, ...
Вінс

30
Чому важче знайти це в документах, ніж у stackoverflow
Борис Д. Теохаров

245

Розширення тієї самої відповіді

  1. У цій публікації ЗУ детально викладені накладні та механізми зберігання.
  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 - кількість виділених байтів

хх

      Type | A= worst case (x/3) | B = best case (x) | words estimate (A/4.5) - (B/4.5)
-----------+---------------------------------------------------------------------------
  TINYTEXT |              85     | 255               | 18 - 56
      TEXT |          21,845     | 65,535            | 4,854.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/a/35785869/1881812


4
Яке обґрунтування цього "A VARCHAR слід завжди використовувати замість TINYTEXT"? Чи не було б краще (оскільки ефективніше зберігання) іноді використовувати менший TINYTEXT?
владіти

24
@vlasits прочитайте детальну інформацію про включений пост. (1) всі типи тексту, включаючи мініатюрні тексти, зберігаються як об'єкти поза рядком, який є однією накладною (2) Потім на ці об'єкти посилаються адреси 8 або 16 байт. тож незалежно від того, наскільки крихітний ваш крихітний текст, ви додаєте зайві накладні витрати, що також для максимального розміру 255 байт. Зрозуміло, що слід використовувати варчар, який не має будь-якого з вищезазначених накладних витрат.
Анкан-Зероб

4
@ Ankan-Zerob З огляду на те, що дуже очевидно, що TINYTEXT ніколи не слід застосовувати над VARCHAR, що є обґрунтуванням того, щоб він навіть мав його як варіант? Чи є якісь незрозумілі випадки використання, коли це необхідно?
nextgentech

4
@nextgentech Погляньте на сторінку dev.mysql.com/doc/refman/5.0/en/column-count-limit.html . Розмір запису обмежений 64 Кб. Таблиця обмежена 4k стовпцями. А TINYTEXTпідраховує 1 байт + 8 байт проти розміру запису, тоді як VARCHAR(255)вважає від 1 байта + 255 байт до 2 байта + 1020 байт (4 байти UTF-8 символів) проти розміру запису.
Ши

2
Мені подобається виражати розміри полів словами, але ... В англійській мові, як правило, міститься близько 5 символів на слово, а також є пробільний символ, який потрібно зберігати; однак англійська мова завжди буде близькою до 1 байту на символ UTF-8, тому я поділяю на 6, даючи приблизно 40/10 000/2 700 000/710 000 000 слів для різних розмірів. Мови з великою кількістю наголосів, такі як польська, мали б трохи менше слів; Грецька, іврит, арабська та ін. (З переважно 2-байтними послідовностями) близько половини; Ідеографи CJK - це 3 або 4-байтні послідовності, але я не знаю, скільки довгих слів.
ChrisV

44

Виникаючи перед завданням @ 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, залежно).

Це, звичайно, ігнорування накладних витрат тощо.


Символи CJK можуть використовувати 3 або 4 послідовності байтів: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor

8

Це добре, але не відповідає на питання:

"Завжди слід використовувати VARCHAR замість TINYTEXT." Tinytext корисний, якщо у вас широкі рядки - оскільки дані зберігаються поза записом. Є продуктивність накладних витрат, але вона має користь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.