web-dev-qa-db-ja.com

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

MySQLのドキュメント には、4つのTEXT型があります。

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

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

698
Lalith B

のドキュメントから

を入力します。最大長
 ----------- + ------------------------------- ------ 
 TINYTEXT | 255(2  8−1)バイト
 TEXT | 65,535(216−1)バイト= 64KiB [...] MEDIUMTEXT | 1。 16,777,215(224−1)バイト= 16MiB [....] LONGTEXT | 4,294,967,295(232−1)バイト= 4GiB [...]

カラムに格納できる 文字 の数は、 文字エンコーディング によって異なります。

1387
Bridge

同じ答えの拡大

  1. このSO post: 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 、utf-8では最大3バイト。

このIS素早い判断のための大まかな推定表!

  1. 最悪の場合(UTF-8文字あたり3バイト)から最善の場合(UTF-8文字あたり1バイト)
  2. 英語の単語1単語あたりの平均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

Chris Vの回答も参照してください。 https://stackoverflow.com/a/35785869/1881812

221
Ankan-Zerob

@ 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バイトを必要とし、(大幅に簡略化されている)Wordごとに約2文字を使用すると見なされる可能性があるため、他の2つの間にあると考えられます。 (CJKスクリプトは、UTF-16を使用した場合、必要なストレージが少なくなる可能性があります)。

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

40
ChrisV

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

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

6
colin0117