MySQL:大VARCHAR与TEXT?

我在MySQL中有一个消息表,它记录用户之间的消息。 除了典型的ID和消息类型(所有整数类型),我需要将实际的消息文本保存为VARCHAR或TEXT。 我设置了3000个字符的前端限制,这意味着这些消息永远不会被插入到数据库比这更长。

使用VARCHAR(3000)还是TEXT有理由吗? 有些东西只是写VARCHAR(3000),感觉有点反直觉。 我已经通过堆栈溢出的其他类似的帖子,但将是很好的获得特定于这种类型的常见信息存储的意见。

TEXT和BLOB存储在表格外,表格只有一个指向实际存储位置的指针。

VARCHAR与表内容保存在一起。 当尺寸合理时,VARCHAR会更快,其权衡取决于您的数据和硬件,因此您希望将实际情况与您的数据进行基准比较。

你能预测用户输入多长时间吗?

VARCHAR(X)

案例:用户名,电子邮件,国家,主题,密码


文本

案例:消息,电子邮件,评论,格式化的文本,HTML,代码,图像,链接


MEDIUMTEXT

案例:大型json机构,短中长书,csv字符串


LONGTEXT

案例:教科书,课程,多年的日志文件,哈利波特与火焰杯,科学考察记录

只是为了澄清最佳做法:

  1. 文本格式的信息应该几乎总是被存储为TEXT(它们最终会变得很长)

  2. 字符串属性应该存储为VARCHAR(目标用户名,主题等)。

我知道你有一个前端限制,这是很好的,直到它不是。 *咧嘴*诀窍是将数据库视为与连接到数据库的应用程序分开。 仅仅因为一个应用程序对数据进行了限制,并不意味着数据本质上是有限的。

信息本身是什么,迫使他们不要超过3000个字符? 如果它只是一个任意的应用程序约束(例如,对于文本框或其他内容),请在数据层使用TEXT字段。

免责声明:我不是MySQL专家…但这是我对这些问题的理解。

我认为TEXT存储在mysql行之外,而我认为VARCHAR是作为行的一部分存储的。 对于mysql行,有一个最大的行长度,所以你可以通过使用VARCHAR来限制你可以在一行中存储多少其他数据。

另外,由于VARCHAR构成行的一部分,我怀疑查看该字段的查询将比使用TEXT块的查询快一些。