协慌网

登录 贡献 社区

TINYTEXT,TEXT,MEDIUMTEXT 和 LONGTEXT 的最大存储大小

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

  1. 细语
  2. 文本
  3. 中文字
  4. 长文本

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

答案

文档中

Type | Maximum length
-----------+-------------------------------------
  TINYTEXT |           255 (2  8 −1) bytes
      TEXT |        65,535 (2 16 −1) bytes = 64 KiB
MEDIUMTEXT |    16,777,215 (2 24 −1) bytes = 16 MiB
  LONGTEXT | 4,294,967,295 (2 32 −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 字符 3 个字节)到最好的情况(每个 utf-8 字符 1 个字节)
  2. 假设英语平均每个单词有 4.5 个字母
  3. x 是分配的字节数

xx

Type | A= worst case (x/3) | B = best case (x) | words estimate (A/4.5) - (B/4.5)
-----------+---------------------------------------------------------------------------
  TINYTEXT |              85     | 255               | 18 - 56
      TEXT |          21,845     | 65,535            | 4,854.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

请同时参考克里斯五世的答案: https : //stackoverflow.com/a/35785869/1881812

受到 @ 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 个字符,因此它们将位于其他两个字符之间。 (根据情况,使用 UTF-16,CJK 脚本可能需要较少的存储空间)。

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