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

小文本 发短信 中等文本 长文本

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


当前回答

同样答案的展开

这篇SO文章详细概述了开销和存储机制。 正如第(1)点所指出的,应该总是使用VARCHAR而不是TINYTEXT。但是,在使用VARCHAR时,最大行大小不应超过65535字节。 如这里所述http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html, utf-8最多3个字节。

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

从最坏的情况假设(每个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 |          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

其他回答

从文档(MySQL 8):

      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

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

同样答案的展开

这篇SO文章详细概述了开销和存储机制。 正如第(1)点所指出的,应该总是使用VARCHAR而不是TINYTEXT。但是,在使用VARCHAR时,最大行大小不应超过65535字节。 如这里所述http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html, utf-8最多3个字节。

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

从最坏的情况假设(每个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 |          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

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

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

面对@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

In English, 4.8 letters per word is probably a good average (eg norvig.com/mayzner.html), though word lengths will vary according to domain (e.g. spoken language vs. academic papers), so there'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 rounded down from 5.8 bytes per word. Languages with lots of accents such as say Polish would store slightly fewer words, as would e.g. German with longer words.

需要多字节字符的语言,如希腊语、阿拉伯语、希伯来语、印地语、泰语等,通常在UTF-8中每个字符需要两个字节。我疯狂地猜测每个单词有5个字母,从每个单词11个字节四舍五入。

CJK脚本(汉字,汉字,平假名,片假名等)我一无所知;我认为字符大多需要3个字节的UTF-8,并且(通过大量简化)它们可能被认为每个单词使用大约2个字符,所以它们应该介于其他两个之间。(CJK脚本使用UTF-16可能需要更少的存储空间,具体取决于情况)。

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