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

Mysql TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT最大存储大小,mysql,innodb,Mysql,Innodb,根据,有四种文本类型: TINYTEXT 正文 媒体文本 长文 假设字符编码为UTF-8,我可以在每种数据类型的列中存储的最大长度是多少 类型|最大长度 -----------+------------------------------------- TINYTEXT | 255(28−1) 字节 正文| 65535(216)−1) 字节=64千字节 中文本| 16777215(224−1) 字节=16个MiB 长文本| 4294967295(232−1) 字节=4 GiB 请注意,可以存储在

根据,有四种文本类型:

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

    类型|最大长度 -----------+------------------------------------- TINYTEXT | 255(28−1) 字节 正文| 65535(216)−1) 字节=64千字节 中文本| 16777215(224−1) 字节=16个MiB 长文本| 4294967295(232−1) 字节=4 GiB
    请注意,可以存储在列中的字符数将取决于字符编码。

    相同答案的展开

  • 本文详细介绍了开销和存储机制
  • 如第(1)点所述,应始终使用VARCHAR而不是TINYTEXT。但是,使用VARCHAR时,最大行大小不应超过65535字节
  • 如本文所述,utf-8的最大字节数为3
  • 这是一个用于快速决策的粗略估算表

  • 因此,从最坏情况(每个utf-8字符3个字节)到最佳情况(每个utf-8字符1个字节)
  • 假设英语平均每个单词有4.5个字母
  • x是分配的字节数
  • x-x


    也请参考Chris V的答案:

    上升到@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个字母可能是一个很好的平均值(例如),尽管单词长度因领域而异(例如口语和学术论文),因此没有必要过于精确。英语主要是单字节ASCII字符,偶尔也有多字节字符,因此每个字母接近一个字节。字间空间必须允许一个额外的字符,所以我已经从每个字5.8字节向下舍入。带有很多口音的语言,比如说波兰语,存储的单词会稍微少一些,比如德语,存储的单词会更长一些

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

    CJK脚本(汉字、汉字、平假名、片假名等)我一无所知;我相信字符在UTF-8中大部分需要3个字节,并且(经过大量简化)它们可能被认为每个字使用大约2个字符,因此它们将介于其他两个字符之间。(CJK脚本使用UTF-16可能需要更少的存储,具体取决于具体情况)


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

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


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

    以文本类型为例。它可以包含65535字节的数据。UTF-8包含多字节字符。因此,如果仅使用丹麦字符“Ø”填充字段,则只能获得32767个字符,因为UTF-8字符由两个字节组成。如果你把它装入“A”,你会得到65535个字符,也可以考虑阅读什么是“VARCHARR应该被用来代替TiNeTyt”的基本原理?有时使用较小的TINYTEXT不是更好(因为存储效率更高)吗?@Vlasts阅读随附的SO帖子了解详细信息。(1) 所有文本类型(包括tinytext)都存储为行外的对象,行外的开销为1(2)。然后这些对象由地址8或16字节引用。因此,无论tinytext有多小,都会增加不必要的开销,对于255字节的最大大小也是如此。显然应该使用varchar,这不会产生上述任何开销。@Ankan Zerob鉴于TINYTEXT似乎永远不应该在varchar上使用,那么将其作为选项的理由是什么?是否有一些模糊的用例是必需的?@nextgentech看一看。记录大小限制为64千字节。表限制为4k列。A
    TINYTEXT
    根据记录大小计算1字节+8字节,而A
    VARCHAR(255)
    根据记录大小计算从1字节+255字节到2字节+1020字节(4字节UTF-8字符)。我喜欢用文字表示字段大小,但。。。英语通常被认为每个单词大约有5个字符,并且还需要存储一个空格字符;然而,英语总是接近每UTF-8字符1个字节,所以我将除以6得到不同大小的40/10000/2700000/710000000个单词。有很多口音的语言,比如波兰语,单词会稍微少一些;希腊语、希伯来语、阿拉伯语等(大部分为2字节序列)约占一半;CJK表意文字是3或4字节的序列,但我不知道单词的长度。@Bridge我不确定是否理解,但这意味着TINYTEXT最多可以包含255个字符,对吗?@Lykos是的,嗯-取决于字符。来自文档:
    最大长度为255(28–1)个字符的文本列。如果该值包含多字节字符,则有效的最大长度较小。
    有关详细信息,请参阅Ankan的答案。@aurel.g这是您真正回答问题的方式。我同意Christophe的观点,这就是mySQL应该如何显示其参数的方式——即使只是作为他们的…神秘文本视图的补充速记。为什么在文档中比在stackoverflow@BorisD.Teoharov这似乎是MySQL命名其文档页面的方式,如果不指定确切的所需单词,则很难找到。新文档在此显示CJK字符可能使用3或4字节序列:
          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
    
          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