MySQL中CHAR和VARCHAR的区别
VARCHAR和CHAR是两种最主要的字符串类型。不幸的是,很难准确地说明这些值是如何储备在磁盘和内存中的,由于这跟储备引擎的详细实现有关。下面的描写假设使用的储备引擎是InnoDB和/或者MyISAM。假如使用的不是这两种储备引擎,请参照 所使用的储备引擎的文档。
先看看VARCHAR和CHAR值平常在磁盘上如何储备。请留意,储备引擎储备CHAR或者VARCHAR值的方式在内存中和在磁盘上大概不一样,所以MySQL效劳器从储备引擎读出的值大概需要转换为另一种储备格局。
VARCHAR类型
VARCHAR类型用于储备可变长字符串,是最常见的字符串数据类型。它比定长类型更节约空间,由于它仅使用必要的空间(例如,越短的字符串使用越少的空间)。有一种状况例外,假如MySQL表使用ROW_FORMAT=FIXED创立的话,每一行都会使用定长储备,这会很白费空间。
VARCHAR需要使用1或2个额外字节记载字符串的长度:假如列的最大长度小于或等于255字节,则只使用1个字节表示,不然使用2个字节。假设采纳latin1字符集,一个VARCHAR(10)的列需要11个字节的储备空间。VARCHAR(1000)的列则需要1002个字节,由于需要2个字节储备长度信息。
VARCHAR节约了储备空间,所以对机能也有帮忙。但是,由于行是变长的,在UPDATE时大概使行变得比本来更长,这就致使需要做额外的工作。假如一个行占用的空间增长,并且在页内没有更多的空间可以储备,在这种状况下,不一样的储备引擎的处置方式是不一样的。例如,MyISAM会将行拆成不一样的片段储备,InnoDB则需要分裂页来使行可以放进页内。其他一些储备引擎或许从不在原数据位置更新数据。
VARCHAR适用状况
下面这些状况下适用VARCHAR是适宜的:
字符串列的最大长度比均匀长度大许多
列的更新很少,所以碎片不是问题
使用了像UTF-8这样复杂的字符集,每个字符都使用不一样的字节数停止储备
CHAR类型
CHAR类型是定长的:MySQL总是按照定义的字符串长度分配足够的空间。当储备CHAR值时,MySQL会删除所有的末尾空格。CHAR值会按照需要采纳空格停止填充以利便比力。
CHAR适合储备很短的字符串,或者所有值都接近统一个长度。例如,CHAR非常适合储备密码的MD5值,由于这是一个定长的值。关于经常变动的数据,CHAR也比VARCHAR更好,由于定长的CHAR类型不容易发生碎片。关于非常短的列,CHAR比VARCHAR在储备空间上也更有效力。例如用CHAR(1)来储备只要Y和N的值,假如采纳单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,由于还有一个记载长度的额外字节。
测试
下面通过例子来详细说明CHAR与VARCHAR行动上的不一样,第一,我们创立一张只要一个CHAR(10)字段的表,并且往里面插入一些值:
CREATE TABLE char_test ( char_col CHAR(10) ); INSERT INTO char_test VALUES ('string1'). (' string2'). ('string3 ');
当我们检索这些值的时候,会发明string3末尾的空格被截断了。
SELECT CONCAT("'", char_col, "'") FROM char_test;
施行结果:
假如用VARCHAR(10)字段储备雷同的值,可以得到如下结果:
CREATE TABLE varchar_test ( varchar_col VARCHAR(10) ); INSERT INTO varchar_test VALUES ('string1'). (' string2'). ('string3 '); SELECT CONCAT("'", varchar_col, "'") FROM varchar_test;
施行结果
VARCHAR(5)与VARCHAR(200)的不同
我们倘使用VARCHAR(5)和VARCHAR(200)来储备'hello',我们知道这两者的空间开销是一样的。那么我们可以让VARCHAR的长度始终保持很大吗?使用更短的列有什么优势吗?
事实证明有很大的优势。更长的列会耗损更多的内存,由于MySQL平常会分配牢固大小的内存块来留存内部值。特别是使用内存暂时表停止排序或操纵时会特殊糟糕。在利用磁盘暂时表停止排序时也一样糟糕。
所以最好的战略是只分配真正需要的空间。
总结
当我们为字符串类型的字段拔取类型的时候,推断该拔取VARCHAR还是CHAR,我们可以从以下几个方面来思考:
该字段数据集的均匀长度与最大长度可否相差很小,若相差很小优先思考CHAR类型,反之,思考VARCHAR类型。
若字段储备的是MD5后的哈希值,或一些定长的值,优先拔取CHAR类型。
若字段经常需要更新,则优先思考CHAR类型,由于CHAR类型为定长,因此不容易发生碎片。
关于字段值储备很小的信息,如性别等,优先拔取CHAR类型,由于VARCHAR类型会占用额外的字节留存字符串长度信息。
总之一句话,当我们能够拔取CHAR类型的时候,或者说空间耗损相对并不是影响因素的重点时,尽量拔取CHAR类型,由于在其他方面,CHAR类型都有着或多或少的优势。而当空间耗损成为了很大的影响因素今后,我们则思考使用VARCHAR类型。
引荐教程:《Mysql教程》
以上就是MySQL中CHAR和VARCHAR的不同的具体内容,更多请关注百分百源码网其它相关文章!