TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT maximum storage sizes
根据MySQL文档,有四种文本类型:
小文本
文本
中间文本
长文本
假设字符编码是UTF-8,那么我可以在每种数据类型的列中存储的最大长度是多少?
- 以文本类型为例。它可以包含65535字节的数据。UTF-8包含多字节字符。因此,如果只使用丹麦语字符"&216;"填充字段,则只能获得32767个字符,因为UTF-8字符由两个字节组成。如果您用"A"填充它,您将得到65535个字符。
- 还要考虑读取哪个数据类型更适合使用text或varchar
从文档中:
1 2 3 4 5 6
| Type | Maximum length
-----------+-------------------------------------
TINYTEXT | 255 (2 8&minus ;1) bytes
TEXT | 65,535 (216&minus ;1) bytes = 64 KiB
MEDIUMTEXT | 16,777,215 (224&minus ;1) bytes = 16 MiB
LONGTEXT | 4,294,967,295 (232&minus ;1) bytes = 4 GiB |
请注意,可以存储在列中的字符数将取决于字符编码。
- @Bridge不确定我明白,但这意味着TinyText最多可以有255个字符,对吗????
- @莱科斯是的,好吧-取决于角色。从文档中: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的答案以了解更多详细信息。
- @这就是你真正回答问题的方式。我同意克里斯托夫的观点,这就是MySQL应该如何呈现其参数——即使只是作为他们的……神秘文本视图的补充速记。
- 可能值得补充的是,字符的大小顺序是几个字节(我想是最小值1)。所以可以在一个文本列中存储10000-50000个字符,…
- @所以你说文件是错的?恐怕我刚刚写了一个测试,在文本列中插入65535个字符,没有问题。
- @桥65535个ASCII字符(每个重1字节)。他指的是在存储可能包含多字节字符的真实文本时所能做的粗略平均值。
- 大家好,有人能告诉我内存是如何分配的吗?例如,如果我使用Longtext,4GB是默认分配的还是基于我们插入的值分配的,它将增加到最大大小(4GB)??
- 为什么在文档中比在stackoverflow中更难找到这个?
同一答案的扩展
这个帖子:varchar(255)vs tinytext/tinyblob和varchar(65535)vs blob/text详细概述日常开支和存储机制。
如第(1)点所述,应始终使用varchar而不是tinytext。但是,使用varchar时,最大行大小不应超过65535字节。
如本文所述,http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html,utf-8最多3个字节。
这是一个粗略的估计表,可以快速做出决定!< BR>
因此,最坏情况假设(每个UTF-8字符3个字节)到最佳情况假设(每个UTF-8字符1个字节)
假设英语平均每个单词有4.5个字母
x是分配的字节数
X-X
1 2 3 4 5 6
| Type | A = worst case (x/3) | B = best case (x) | words estimate (A /4.5) - (B /4.5)
-----------+---------------------------------------------------------------------------
TINYTEXT | 85 | 255 | 18 - 56
TEXT | 21845 | 65,535 | 4854.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会更好吗(因为存储效率更高)?
- @vlasits阅读包含的so post了解详细信息。(1)所有文本类型(包括tinytext)都存储为行外的对象,这是一个开销(2)这些对象随后被地址8或16字节引用。因此,无论您的TinyText有多小,您都会增加不必要的开销,这对于最大255字节的大小来说也是如此。很明显,应该使用varchar,它不会有任何上述开销。
- @考虑到TinyText永远不应该用于varchar,那么将其作为选项的理由是什么?在必要的地方是否有一些模糊的用例?
- @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字符)。
- 我喜欢用文字表达场的大小,但是…英语通常被认为每个字大约有5个字符,而且还有一个空格字符要存储;但是,每个UTF-8字符的英语总是接近1个字节,所以我将除以6,得出不同大小的大约40/10000/2700000/710000000个字。有很多口音的语言,如波兰语,单词会稍微少一些;希腊语、希伯来语、阿拉伯语等(大部分是2字节序列),大约有一半;CJK象形文字是3或4字节序列,但我不知道单词有多长。
- @AnkanZerob的字符集(如utf8mb4,每个字符最多使用四个字节),最坏的字符数不是x/4吗?
- @瓦拉拉里塔是的,很好。但是,这些字符不属于基本的多语言平面[en.wikipedia.org/wiki/&hellip;,包括我们正在考虑的英语词典。如果你有表情符号和特殊的汉字,请考虑一下:)
上升到@ankan zerob的挑战,这是我对可以存储在每种文本类型中的最大长度的估计,用文字度量:
1 2 3 4 5 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 |
在英语中,每个单词4.8个字母可能是一个很好的平均值(例如norvig.com/mayzner.html),尽管单词长度会根据领域(例如口语和学术论文)而变化,所以没有必要过于精确。英语大部分是单字节的ASCII字符,偶尔会有多字节字符,因此每个字母接近一个字节。必须为字间空格允许一个额外的字符,所以我将每个字从5.8字节向下取整。有很多口音的语言,比如说波兰语,存储的单词会稍微少一点,比如德语和长一点的单词。
需要多字节字符的语言,如希腊语、阿拉伯语、希伯来语、印地语、泰语等,通常每个字符需要两个UTF-8字节。每字5个字母,我从每字11个字节向下取整。
我对CJK脚本(汉字、汉字、平假名、片假名等)一无所知;我认为字符大多需要3个字节的UTF-8格式,并且(经过大量简化)每个单词可能使用大约2个字符,因此它们将介于其他两个字符之间。(CJK脚本可能需要较少的存储空间,具体取决于utf-16)。
这当然忽略了存储开销等。
- CJK字符可以使用3或4字节序列:dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
这很好,但没有回答问题:
"应始终使用varchar而不是tinytext。"tinytext在行宽的情况下很有用,因为数据存储在记录之外。有一个性能开销,但它确实有一个用途。