mysql varchar和text疑惑,重装;)

mysql varchar and text doubts, reloaded ;)

我对 mysql 有疑问。我有一些字段,我可以很容易地限制为一些字符,比如姓氏,还有一些字段,比如带有我认为不超过 2 页(或更少字符)的特定事件的迷你日志。我知道这是一个相当普遍的问题,我看到了很多关于它的链接,但我看不出有什么区别和正确的方法。

以下是我的结论和疑惑,如有错误请指正:

-varchar是一个变量类型,没关系如果我设置varchar(10)或varchar(65535),尽管与传递到中文本的 65536 不同。 -varchar带一个或多个参数是一样的,只取必要的space,只是对保存的限制和对表示的限制。
-如果我在我的应用程序一侧进行限制,它完全相同并且更灵活
-text 是固定长度的,如果我设置text 会占用65535,不管我用不用。

varchar
- 它有一个超载,必须首先找到字段的长度。
- 它在保存长度的地方多了一个字节的成本。
- 它是内联保存,这意味着在 table 中。
- 它总是有更好的性能。

文本
- 它存储在 table 之外,有一个指向我的文本的指针,是真的吗?
-它有固定数量的字符。

-在 varchar 和 text 中设置的长度是以字符为单位,而不是以字节为单位(以前的版本不同)

结论:

-出于这些原因,最好始终使用 varchar,只有一种情况不正确,即我确切知道字符数的情况。
所有其他情况,这是最常见的,最好使用最长的 varchar,因此它是名字或姓氏(虽然我可以将它限制为文本(35),但我不知道名字是否是"Tom" 或 "Federico Guillermo Rodrigo Cayetano"),至于字段事项或描述(更多变量),或者对于更大的文本,如迷你日志,可以从 0 到 3 页字符不等(在我的案例,但我们可以把它带到一个极端,比如 0 到 16 页的文本,大约 65535 个字符)。 这是正确的,特别是如果我们无法知道未来的要求,比如最长的描述,如果我们限制 table space,要求的改变可能是一个难题。

最后,作为奖励 :),如果文本超过 65535 个字符但谁可以变化,会发生什么情况?将其设置为中等文本是否合理,如果可以变化则设置为长文本?

我认为您的假设并不完全正确,可能过于偏执或受到不再有效的历史问题的污染。

通常最好使用 VARCHAR,因为 MySQL 和其他数据库引擎已经过优化,可以很好地处理它们。从历史上看(1990 年代),当使用 tables 与 fixed-length 行与可变长度时存在显着的性能差异,但今天这已无关紧要。

同样,TEXT 列过去的所有数据都存储在主要 table 数据之外。现在我相信使用了一种混合方法,如有必要,前 N 个字符存储在行中,其余字符存储在 BLOB 系统中。定义为变长,单个字符不使用65535字节存储。

对于更大的文本块,您需要使用 LONGTEXT,但此时您应该评估您是否正确使用了数据库。在那里存储、检索和操作巨大的对象可能会很麻烦。

我会默认使用 VARCHAR(255) 来处理任何 "text" 并在必要时延长它的使用时间。缩短通常是有问题的,除了非常狭窄的情况,比如你存储一个 ISO 国家代码,根据定义,它是两个字符。

假设名称是 "no more than 32 characters" 几乎总是错误的假设。除非你有充分的理由不这样做,否则请将它们敞开。

您可能认为城市或地名之类的东西也很短,但是 you'd be wrong。世界是一个奇怪的地方。期待意外。