上升到@ Ankan-Zerob的挑战,这是我对每个文本类型 measured in words 中可以存储的最大长度的估计:
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
在 English 中,每个单词4.8个字母可能是一个很好的平均值(例如norvig.com/mayzner.html),尽管单词长度会根据域名(例如口语与学术论文)而有所不同,因此'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从每个单词的5.8个字节向下舍入 . 具有许多重音的语言,例如波兰语,可以存储略少的单词,例如德语用较长的单词 .
4 回答
来自documentation:
请注意,可以存储在列中的字符数取决于字符编码 .
扩展相同的答案
此SO帖子:varchar(255) vs tinytext/tinyblob and varchar(65535) vs blob/text详细列出了开销和存储机制 .
如第(1)点所述,应始终使用A VARCHAR而不是TINYTEXT . 但是,使用VARCHAR时,max rowsize不应超过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
请参阅Chris V的答案:https://stackoverflow.com/a/35785869/1881812
上升到@ Ankan-Zerob的挑战,这是我对每个文本类型 measured in words 中可以存储的最大长度的估计:
在 English 中,每个单词4.8个字母可能是一个很好的平均值(例如norvig.com/mayzner.html),尽管单词长度会根据域名(例如口语与学术论文)而有所不同,因此'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从每个单词的5.8个字节向下舍入 . 具有许多重音的语言,例如波兰语,可以存储略少的单词,例如德语用较长的单词 .
需要 multi-byte 字符的语言,如希腊语,阿拉伯语,希伯来语,印地语,泰语等,通常需要UTF-8中每个字符两个字节 . 每个单词5个字母疯狂地猜测,我从每个单词的11个字节向下舍入 .
CJK剧本(汉字,汉字,平假名,片假名等)我一无所知;我认为字符大多需要UTF-8中的3个字节,并且(大量简化)它们可能被认为每个字使用大约2个字符,所以它们将介于其他两个字符之间 . (CJK脚本可能需要使用UTF-16来减少存储,具体取决于) .
这当然忽略了存储开销等 .
这很好,但没有回答这个问题:
“应始终使用VARCHAR而不是TINYTEXT . ”如果你有宽行,Tinytext很有用 - 因为数据存储在记录之外 . 存在性能开销,但确实有用 .