TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT最大存储容量

时间:2012-12-18 12:13:35

标签: mysql innodb

the MySQL docs,有四种TEXT类型:

  1. TINYTEXT
  2. TEXT
  3. MEDIUMTEXT
  4. LONGTEXT
  5. 假设字符编码为UTF-8,我可以在每种数据类型的列中存储的最大长度是多少?

4 个答案:

答案 0 :(得分:1396)

来自documentation

      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 :(得分:221)

扩展相同的答案

  1. 这个帖子: varchar(255) vs tinytext/tinyblob and varchar(65535) vs blob/text 详细列出了开销和存储机制。
  2. 如第(1)点所述,应始终使用A VARCHAR而不是TINYTEXT。但是,使用VARCHAR时,最大行数不应超过65535字节。
  3. 如此处所述http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html,utf-8最多3个字节。
  4. 这是一个用于快速决策的粗略估计表!

    1. 所以最坏情况假设(每个utf-8字符3个字节)到最佳情况(每个utf-8字符1个字节)
    2. 假设英语平均每个单词4.5个字母
    3. x是分配的字节数
    4. 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

答案 2 :(得分:37)

升级到@ 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剧本(汉字,汉字,平假名,片假名等)我一无所知;我认为字符大多需要UTF-8中的3个字节,并且(大量简化)它们可能被认为每个字使用大约2个字符,所以它们将介于其他两个字符之间。 (CJK脚本可能需要使用UTF-16来减少存储,具体取决于)。

这当然忽略了存储开销等。

答案 3 :(得分:6)

这很好,但没有回答这个问题:

“应始终使用VARCHAR而不是TINYTEXT。”如果你有宽行,Tinytext很有用 - 因为数据存储在记录之外。存在性能开销,但确实有用。