根据MySQL文档,有四种TEXT类型:
- TINYTEXT
- TEXT
- MEDIUMTEXT
- LONGTEXT
来自MySQL 8的文档:
数据类型 | 最大长度 -----------+------------------------------------- TINYTEXT | 255 (2 8−1) 字节 TEXT | 65,535 (216−1) 字节 = 64 KiB MEDIUMTEXT | 16,777,215 (224−1) 字节 = 16 MiB LONGTEXT | 4,294,967,295 (232−1) 字节 = 4 GiB
请注意,您列中可以存储的字符数取决于字符集编码方式。
TEXT列最大长度为255(28-1)个字符。如果值包含多字节字符,则有效最大长度会减少。
请参考Ankan的答案了解更多细节。 - Bridge同样答案的拓展
这是一个快速决策的粗略估计表格!
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://dev59.com/kWYr5IYBdhLWcg3wIG1u#35785869
TINYTEXT
在记录大小中计为1个字节+8个字节,而VARCHAR(255)
在记录大小中计算从1个字节+255个字节到2个字节+1020个字节(4个字节的UTF-8字符)。 - Shi响应 @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
需要使用多字节字符的语言,如希腊语、阿拉伯语、希伯来语、印地语、泰语等,通常需要UTF-8中的两个字节才能表示一个字符。猜测一个单词大约包含5个字母,因此我将其舍入为每个单词11个字节。
CJK文字(汉字,日本汉字,平假名,片假名等)我一无所知;我相信字符在UTF-8中大多需要3个字节,并且(极为简化地说),它们可能被认为每个单词使用约2个字符,因此它们会介于另外两者之间。(根据情况,CJK文本使用UTF-16可能需要更少的存储空间。)这很好,但并没有回答问题:
"在所有情况下都应该使用VARCHAR而不是TINYTEXT"。如果您有宽列,则Tinytext非常有用,因为数据存储在记录之外。虽然存在性能开销,但确实有用途。