首页 文章

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

提问于
浏览
693

the MySQL docs,有四种TEXT类型:

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT

  • LONGTEXT

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

4 回答

  • 218

    来自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
    

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

  • 1377

    扩展相同的答案

    这是一个用于快速决策的粗略估计表!

    • 所以最坏的情况假设(每个utf-8字符3个字节)到最佳情况(每个utf-8字符1个字节)

    • 假设英语每个单词平均有4.5个字母

    • 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

  • 36

    上升到@ Ankan-Zerob的挑战,这是我对每个文本类型 measured in words 中可以存储的最大长度的估计:

    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
    

    English 中,每个单词4.8个字母可能是一个很好的平均值(例如norvig.com/mayzner.html),尽管单词长度会根据域名(例如口语与学术论文)而有所不同,因此's no point being too precise. English is mostly single-byte ASCII characters, with very occasional multi-byte characters, so close to one-byte-per-letter. An extra character has to be allowed for inter-word spaces, so I' ve从每个单词的5.8个字节向下舍入 . 具有许多重音的语言,例如波兰语,可以存储略少的单词,例如德语用较长的单词 .

    需要 multi-byte 字符的语言,如希腊语,阿拉伯语,希伯来语,印地语,泰语等,通常需要UTF-8中每个字符两个字节 . 每个单词5个字母疯狂地猜测,我从每个单词的11个字节向下舍入 .

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

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

  • 5

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

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

相关问题