TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT最大存储大小

MySQL文档,有四种TEXT类型:

  1. TINYTEXT
  2. 文本
  3. MEDIUMTEXT
  4. 长文

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

898321 次浏览

留档(MySQL 8)

Type | Maximum length-----------+-------------------------------------TINYTEXT |           255 (2 8−1) bytesTEXT |        65,535 (216−1) bytes = 64 KiBMEDIUMTEXT |    16,777,215 (224−1) bytes = 16 MiBLONGTEXT | 4,294,967,295 (232−1) bytes =  4 GiB

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

同一答案的扩展

  1. 这个so帖子详细概述了开销和存储机制。
  2. 如第(1)点所述,应始终使用VARCHAR而不是TINYTEXT。但是,使用VARCHAR时,最大行大小不应超过65535字节。
  3. 如这里所述http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html,utf-8的最大3个字节。

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

  1. 所以最坏情况假设(每个utf-8 char 3字节)到最佳情况(每个utf-8 char 1字节)
  2. 假设英语平均每个单词有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 - 56TEXT |          21,845     | 65,535            | 4,854.44 - 14,563.33MEDIUMTEXT |       5,592,415     | 16,777,215        | 1,242,758.8 - 3,728,270LONGTEXT |   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的挑战,这是我对每个文本类型用言语衡量中可以存储的最大长度的估计:

      Type |         Bytes | English words | Multi-byte words-----------+---------------+---------------+-----------------TINYTEXT |           255 |           ±44 |              ±23TEXT |        65,535 |       ±11,000 |           ±5,900MEDIUMTEXT |    16,777,215 |    ±2,800,000 |       ±1,500,000LONGTEXT | 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,具体取决于)。

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

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

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