在版本5.0.3(允许VARCHAR为65,535字节并停止截断尾随空格)之后,这两种数据类型之间是否有主要区别?
我正在阅读差异列表,注释中仅有的两个是:
对于BLOB和TEXT列上的索引,必须指定索引前缀长度。对于CHAR和VARCHAR,前缀长度是可选的。请参见第7.5.1节“列索引”。
和
BLOB和TEXT列不能具有DEFAULT值。
因此,由于TEXT数据类型有这两个限制,为什么要在varchar(65535)上使用它?是否有一个相对于另一个的性能影响?
在版本5.0.3(允许VARCHAR为65,535字节并停止截断尾随空格)之后,这两种数据类型之间是否有主要区别?
我正在阅读差异列表,注释中仅有的两个是:
对于BLOB和TEXT列上的索引,必须指定索引前缀长度。对于CHAR和VARCHAR,前缀长度是可选的。请参见第7.5.1节“列索引”。
和
BLOB和TEXT列不能具有DEFAULT值。
因此,由于TEXT数据类型有这两个限制,为什么要在varchar(65535)上使用它?是否有一个相对于另一个的性能影响?
Answers:
四分五裂链接到一些信息,说明基本问题(有性能差异),但它不是足够简单地说,一个总是优于其他。(否则,没有理由同时拥有两者。)而且,在MyISM中,VARCHAR的最大64k大小不是每个字段而是每个记录。
基本上,有四种方法可以将字符串存储在数据库记录中:
MyISM对VARCHAR使用类似于#3的内容,对TEXT使用一种混合方法,其中将字符串的开头存储在记录中,然后将字符串的其余部分存储在其他地方。InnoDB与VARCHAR类似,但将完整的TEXT字段存储在记录之外。
使用1&4,记录中的内容总是相同的长度,因此,如果您不需要字符串,但需要后面的内容,则跳过该字段会更容易。#2和#3对于短字符串来说都还不错...#2必须继续寻找标记,而#3可以向前跳过...随着字符串变长,#2对于这种特殊用途会变得更糟案件。
如果您实际上需要读取字符串,则#4会比较慢,因为您必须读取记录,然后读取可能存储在磁盘上其他位置的字符串,具体取决于数据库如何处理它。#1总是非常简单明了,并且再次遇到类似的问题,其中字符串越长,#2变得越差,而字符串很小的情况,#3则比#2差,但是随着字符串变长,效果会更好。
然后是存储需求...#1始终是固定长度,因此如果大多数字符串不是最大长度,它可能会膨胀。#2有1个额外的字节;如果最大长度= 255,则#3通常有2个额外的字节,如果最大为64k,则通常有4个额外的字节。#4具有指针长度,通常还有#3的规则。
对于MySQL 5.1中的特定实现,MyISM的文档状态为:
而对于InnoDB:
...
与处理数据库时的许多其他事情一样,如果不确定不确定什么最适合您的需求,请尝试使用类似的数据和用法对其进行基准测试,并查看它们的行为。
LONGTEXT
并且LONGBLOB
是一个很好的例子。C风格的字符串在MySQL(我所知道的)无处使用。InnoDB确实使用“混合”方法,但是它更复杂,具体取决于行大小,row_format等。几乎不建议以“固定”长度存储字符串,除非它们实际上是恒定长度(country_code,zip_code等)。 。InnoDB有4个ROW_FORMATs
;文本仅讨论其中的1或2。