876

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

  1. 小文本
  2. 文本
  3. 中文本
  4. 长文

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

4

4 回答 4

1644

文档(MySQL 8)

      类型 | 最大长度
-----------+-------------------------
  小文本 | 255 (2 8 -1) 个字节
      正文 | 65,535 (2 16 -1) 字节 = 64 KiB
中文本 | 16,777,215 (2 24 -1) 字节 = 16 MiB
  长文 | 4,294,967,295 (2 32 -1) 字节 = 4 GiB

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

于 2012-12-18T12:18:06.890 回答
272

相同答案的扩展

  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

请同时参考 Chris V 的回答:https ://stackoverflow.com/a/35785869/1881812

于 2014-04-19T12:18:30.700 回答
53

面对@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 脚本可能需要更少的存储空间,具体取决于)。

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

于 2016-03-04T00:33:26.057 回答
10

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

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

于 2017-05-18T15:36:47.587 回答