MySQL CHAR和VARCHAR该如何选择

varchar 和 char 类型

varchar 和 char 是两种主要的字符串类型,用于存储字符。不幸的是,由于实现的方式依赖于存储引擎,因此很难解释这些字符串在磁盘和内存中如何存储,除了除了常用的 innodb 和 myisam 外,假设你使用了其他存储引擎,应当仔细阅读存储引擎的文档。​

varchar 存储可变长度的字符串,也是最常用的字符数据类型。相比固定长度的类型,varchar 所需的存储空间更小,它会尽可能少地使用存储空间(例如,短的字符串占据的空间)。对于 myisam 来说,如果创建表的时候指定了 row_format=fixed 的话,那么会使用固定的空间存储字段而导致空间浪费。varchar 使用1-2个额外的字节存储字符串的长度:当最大长度低于255字节的时候使用1个字节,如果更多的话就使用2个字节。因此,拉丁字符集的 varchar(10)会使用11个字节的存储空间,而 varchar(1000)则会使用1002个字节的存储空间。​

varchar 由于能够节省空间,因此可以改善性能。但是,由于长度可变,当更新数据表的时候数据行的存储空间会变化,这一定程度上会带来额外的开销。如果数据行的长度导致原有的存储位置无法存放,那么不同的存储引擎会做不同的处理。例如 myisam 可能产生数据行的碎片,而 innodb 需要进行磁盘分页来存放更新后的数据行。​

通常,如果最大的列长度远远高于平均长度的话(例如可选的备注字段),使用 varchar 是划算的,同时如果更新的频次很低,那么碎片化也不会是一个问题。需要注意的是,如果使用的是 utf-8字符集,则实际存储的字节长度是根据字符定的。对于中文,推荐的存储字符集是 utf8mb4。​

char 类型的长度是固定的,mysql 会对每个字段分配足够的存储空间。存储char 类型值的时候,mysql 会移除后面多出来的空字符。值是使用空字符进行对齐以便进行比较。对于短的字符串来说,使用 char 更有优势,而如果所有的值的长度几乎一致的话,就可以使用 char。例如存储用户密码的md5值时使用 char 就更合适,这是因为 md5的长度总是固定的。同时,对于字段值经常改变的数据类型来说,char 相比 varchar 也更有优势,因为 char 不会产生碎片。对于很短的数据列,使用 char 比 varchar更高效,例如使用char(1)存储逻辑值的 y 和 n,这种情况下只需要1个字节,而 varchar 需要2个字节。 对于移除空字符这个特性会感觉奇怪,我们举个例子:

create table t_char_varchar_test (
  id int primary key,
  char_col char(10),
  varchar_col varchar(10)
);

insert into t_char_varchar_test 
values 
(1, 'string1', 'string1'),
(2, '  string2', '  string2'),
(3, 'string3  ', 'string3  ');

按上面的结果插入数据表后,string2中的前置空格不会移除,但使用 char 类型存储时,string3尾随空格会被移除,使用 sql 查询结果来检验一下:

select concat("'", char_col, "'"), concat("'", varchar_col, "'") 
from t_char_varchar_test where 1

得出来的结果如下,可以看到 char 类型的 string3后面的空格被移除了,而 varchar类型的没有。这种情况大多数时候不会有什么问题,实际在应用中也经常会使用 trim 函数移除两端的空字符,但是如果确实需要存储空格的时候,那就需要注意不要选择使用 char 类型:

数据如何存储是由存储引擎决定的,而且存储引擎处理固定长度和可变长度的数据的方式并不相同。memory 引擎使用固定大小的行,因此它需要分配最大可能的存储空间——即便数据长度是可变的。但是,对于字符串的对齐和空字符截断是由 mysql 服务端完成的,因此所有存储引擎都是一样的。​

与 char 和 varchar 相似的是 binary和 varbinary,用于存储二进制字节字符,binary 的对齐使用字符0的字节值来对齐,并且再获取值的时候不会截断。如果需要使用字符的字节值而不是字符的话,使用 binary 会更高效,这是因为比较时,一方面不需要考虑大小写,另一方面是mysql一次只比较一个字节。​

结语:

在实际数据表设计中,大多数情况下会选择使用 varchar,但 varchar 需要额外的1-2个字节存储字符串长度。需要注意的是在应用中最好能够限定字段的最大长度,从而可以使得数据表尽可能使用短的 varchar来提高效率。同时,对于固定长度、长度很短或长度变化很小的字符类型,推荐使用 char 类存储,以提高存储效率。

以上就是mysql char和varchar的选择的详细内容,更多关于mysql char和varchar的资料请关注www.887551.com其它相关文章!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐