TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXTの最大ストレージサイズ


796

MySQLドキュメントごとに 4つのTEXTタイプがあります。

  1. TINYTEXT
  2. テキスト
  3. MEDIUMTEXT
  4. 長いテキスト

文字エンコードがUTF-8であると想定して、各データ型の列に格納できる最大長はいくつですか?


26
TEXTタイプを例にとります。65535 バイトのデータを含めることができます。UTF-8にはマルチバイト文字が含まれています。したがって、デンマーク語の文字「Ø」のみを使用してフィールドに入力した場合、UTF-8文字は2バイトで構成されるため、32767文字しか取得できません。「a」を入力すると、65535文字になります。
Andrew Plank 2013

回答:


1518

ドキュメントから:

      タイプ| 最大長
----------- + -------------------------------------
  TINYTEXT | 255(2 8 −1)バイト
      テキスト| 65,535(2 16 −1)バイト= 64 KiB
MEDIUMTEXT | 16,777,215(2 24 -1)バイト= 16 MiB
  LONGTEXT | 4,294,967,295(2 32 −1)バイト= 4 GiB

多くのことに注意してください文字数あなたの列に格納することができますに依存します文字エンコーディング


3
@Bridgeわかりませんが、これはTINYTEXTが最大255文字を取得できることを意味しますよね???
ltdev 2014年

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.詳細については、Ankanの回答を参照してください。
ブリッジ

4
@ aurel.gこれが実際に質問に答える方法です。そして私はクリストフに同意します、これはmySQLがパラメーターを提示する方法です-たとえ彼らの...不可解なテキストビューへの補足的な省略形としても。
cbmtrx 2015年

1
文字の大きさは数バイト(最低1だと思います)であることを付け加えるとよいでしょう。したがって、TEXT列に10,000〜50,000文字を格納できます...
Vince


245

同じ答えの拡大

  1. このSOの投稿では、オーバーヘッドとストレージメカニズムについて詳しく説明しています。
  2. (1)で述べたように、TINYTEXTではなく常にVARCHARを使用する必要があります。ただし、VARCHARを使用する場合、最大行サイズは65535バイトを超えることはできません。
  3. ここで概説されているようにhttp://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html、最大3バイトutf-8。

これは、迅速な決定のための大まかな見積もり表です!

  1. したがって、最悪の場合の仮定(utf-8文字あたり3バイト)から最良の場合(utf-8文字あたり1バイト)
  2. 英語が単語あたり平均4.5文字であると仮定します
  3. xは割り当てられたバイト数です

xx

      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
この「VARCHARは常にTINYTEXTの代わりに使用する必要があります」の根拠は何ですか?小さいTINYTEXTを時々使用する方がよいでしょう(ストレージ効率が高いため)。
vlasits 2014

24
詳細については、@ vlasitsに含まれているSOの投稿をご覧ください。(1)tinytextを含むすべてのテキストタイプは、1つのオーバーヘッドである行の外のオブジェクトとして格納されます。(2)これらのオブジェクトは、アドレス8または16バイトで参照されます。つまり、tinytextがどれほど小さいかに関係なく、最大サイズが255バイトの場合、不必要なオーバーヘッドが追加されます。上記のオーバーヘッドが発生しないvarcharを使用する必要があることは明らかです。
アンカンゼロブ

4
@ Ankan-Zerob TINYTEXTをVARCHARではなく使用してはならないことが非常に明確であるとすると、それをオプションとして使用する根拠は何ですか?必要な場合にあいまいなユースケースはありますか?
nextgentech

4
@nextgentech見持ってdev.mysql.com/doc/refman/5.0/en/column-count-limit.htmlを。レコードサイズは64 KiBに制限されています。テーブルは4k列に制限されています。TINYTEXT一方、レコードサイズに対するカウント1バイト+ 8バイト、VARCHAR(255)レコード・サイズに対して+ 1020バイト、2バイト(4バイトのUTF-8文字)に+ 255バイト1バイトから最大カウント。
Shi

2
フィールドサイズを単語で表現するのが好きですが、英語は通常、1単語あたり約5文字であると考えられており、格納するスペース文字もあります。ただし、英語は常にUTF-8文字あたり1バイトに近いため、6で除算すると、さまざまなサイズで約40 / 10,000 / 2,700,000 / 710,000,000ワードが得られます。ポーランド語などのアクセントの多い言語では、単語の数がわずかに少なくなります。ギリシャ語、ヘブライ語、アラビア語など(ほとんどが2バイトのシーケンス)の約半分。CJK表意文字は3バイトまたは4バイトのシーケンスですが、単語の長さがわかりません。
ChrisV 2016

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文字であり、まれにマルチバイト文字が含まれるため、文字あたり1バイトに近いものです。単語間のスペースには余分な文字を許可する必要があるため、1単語あたり5.8バイトから切り捨てました。ポーランド語などのアクセントの多い言語では、たとえば単語が長いドイツ語のように、格納される単語がわずかに少なくなります。

ギリシャ語、アラビア語、ヘブライ語、ヒンディー語、タイ語などのマルチバイト文字を必要とする言語では、UTF-8では通常、1文字あたり2バイトが必要です。1ワードあたり5文字と乱暴に推測して、1ワードあたり11バイトから切り捨てました。

CJKスクリプト(漢字、漢字、ひらがな、カタカナなど)私は何も知りません。文字はほとんどUTF-8で3バイトを必要とし、(大幅な簡略化により)単語あたり約2文字を使用すると考えられるため、他の2つの文字の間にあると思います。(CJKスクリプトは、場合によっては、UTF-16を使用して必要なストレージが少なくなる可能性があります)。

もちろん、これはストレージのオーバーヘッドなどを無視しています。


CJK文字は3または4バイトのシーケンスを使用できます:dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor

8

これはいいですが、質問には答えません:

「VARCHARは常にTINYTEXTの代わりに使用する必要があります。」Tinytextは、行が広い場合に役立ちます。データはレコードから格納されるためです。パフォーマンスのオーバーヘッドがありますが、それは用途があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.