• 售前

  • 售后

热门帖子
入门百科

MySQL CHAR和VARCHAR该如何选择

[复制链接]
我爱霍启刚掖 显示全部楼层 发表于 2021-10-27 20:22:05 |阅读模式 打印 上一主题 下一主题
目次


  • VARCHAR 和 CHAR 类型
  • 结语:

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个字节。 对于移除空字符这个特性会感觉希奇,我们举个例子:
  1. CREATE TABLE t_char_varchar_test (
  2.   id INT PRIMARY KEY,
  3.   char_col CHAR(10),
  4.   varchar_col VARCHAR(10)
  5. );
  6. INSERT INTO t_char_varchar_test
  7. VALUES
  8. (1, 'string1', 'string1'),
  9. (2, '  string2', '  string2'),
  10. (3, 'string3  ', 'string3  ');
复制代码
按上面的结果插入数据表后,string2中的前置空格不会移除,但利用 CHAR 类型存储时,string3尾随空格会被移除,利用 SQL 查询结果来检验一下:
  1. SELECT CONCAT("'", char_col, "'"), CONCAT("'", varchar_col, "'")
  2. 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的资料请关注草根技术分享其它相关文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作