关于mysql:TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT最大存储大小

TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT maximum storage sizes

根据MySQL文档,有四种文本类型:

  • 小文本
  • 文本
  • 中间文本
  • 长文本
  • 假设字符编码是UTF-8,那么我可以在每种数据类型的列中存储的最大长度是多少?


    从文档中:

    1
    2
    3
    4
    5
    6
          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

    请注意,可以存储在列中的字符数将取决于字符编码。


    同一答案的扩展

  • 这个帖子:varchar(255)vs tinytext/tinyblob和varchar(65535)vs blob/text详细概述日常开支和存储机制。
  • 如第(1)点所述,应始终使用varchar而不是tinytext。但是,使用varchar时,最大行大小不应超过65535字节。
  • 如本文所述,http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html,utf-8最多3个字节。
  • 这是一个粗略的估计表,可以快速做出决定!< BR>

  • 因此,最坏情况假设(每个UTF-8字符3个字节)到最佳情况假设(每个UTF-8字符1个字节)
  • 假设英语平均每个单词有4.5个字母
  • x是分配的字节数
  • X-X

    1
    2
    3
    4
    5
    6
          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


    上升到@ankan zerob的挑战,这是我对可以存储在每种文本类型中的最大长度的估计,用文字度量:

    1
    2
    3
    4
    5
    6
          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)。

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


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

    "应始终使用varchar而不是tinytext。"tinytext在行宽的情况下很有用,因为数据存储在记录之外。有一个性能开销,但它确实有一个用途。