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


796

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

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

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


26
以TEXT类型为例。它可以包含65535 字节的数据。UTF-8包含多字节字符。因此,如果仅使用丹麦字符“Ø”填充该字段,则将仅获得32767个字符,因为该UTF-8字符由两个字节组成。如果用“ a”填充,则将获得65535个字符。
安德鲁·普兰克

Answers:


1517

文档中

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

需要注意的是数目可以存储在您的专栏将取决于字符编码


3
@Bridge不确定我是否理解,但这意味着TINYTEXT最多可以包含255个字符,对吗???
ltdev2014年

9
@Lykos是的,很好-取决于字符。从文档中:A TEXT column with a maximum length of 255 (28 – 1) characters. The effective maximum length is less if the value contains multi-byte characters.请参阅Ankan的答案以获取更多详细信息。

4
@ aurel.g这就是您真正回答问题的方式。我同意Christophe的观点,这就是mySQL如何显示其参数-即使只是作为它们的... arcane文本视图的补充速记。
cbmtrx

1
可能值得补充的是,一个字符的数量级是几个字节(我想至少是1个字节)。因此,一个人可能会在TEXT列中存储10,000-50,000个字符,...
Vince

29
为什么很难找到这样的文档比计算器
鲍里斯D. Teoharov

245

扩展相同的答案

  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


4
此“应始终使用VARCHAR代替TINYTEXT”的理由是什么?有时使用较小的TINYTEXT会更好(因为存储效率更高)吗?
vlasits 2014年

24
@vlasits阅读了随附的SO帖子以获取详细信息。(1)所有文本类型(包括tinytext)都作为对象存储在行外部,这是一种开销(2)。然后,这些对象由地址8或16字节引用。因此,无论您的tinytext多么微小,您都将添加不必要的开销,最大开销也为255个字节。很明显,应该使用varchar,它不会有上述任何开销。
2014年

4
@ Ankan-Zerob鉴于很明显,永远不要在VARCHAR上使用TINYTEXT,将它作为选项的理由是什么?是否有一些必要的晦涩用例?
nextgentech

4
@nextgentech看一看dev.mysql.com/doc/refman/5.0/en/column-count-limit.html。记录大小限制为64 KiB。一个表格最多只能有4k列。相TINYTEXT对于记录大小,计数为1字节+ 8字节,而相对于记录大小,VARCHAR(255)计数为1字节+ 255字节至2字节+ 1020字节(4字节UTF-8字符)。

2
我喜欢用单词表示字段大小,但是...通常,英语通常被认为每个单词约有5个字符,并且还需要存储一个空格字符。但是,每个UTF-8字符的英语将始终接近1个字节,因此对于不同的大小,我将用6除以给出40 / 10,000 / 2,700,000 / 710,000,000个单词。带有重音的语言(例如波兰语)的单词会略少;希腊文,希伯来文,阿拉伯文等(大多数为2字节序列)大约一半;CJK表意文字是3或4字节的序列,但我不知道单词有多长。
ChrisV '16

44

面对@ 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个字符,因此它们将介于其他两个字符之间。(取决于使用CTF脚本,使用UTF-16可能需要更少的CJK脚本存储空间)。

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


CJK字符可以使用3或4个字节的序列:dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
Raptor

8

很好,但是不能回答这个问题:

“应该始终使用VARCHAR代替TINYTEXT。” 如果行很宽,则Tinytext很有用-因为数据存储在记录之外。有性能开销,但确实有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.