MySQL CHAR 和 VARCHAR 的区别

本文详细比较了MySQL中的CHAR和VARCHAR数据类型,包括存储方式、最大长度限制、尾随空格处理以及对读写效率的影响。CHAR适合固定长度数据,节省空间;VARCHAR适用于变长数据,节省空间但存取效率较低。


在 MySQL 中,CHAR 和 VARCHAR 是两种不同的文本数据类型,CHAR 和 VARCHAR 类型声明时需要指定一个长度,该长度指示您希望存储的最大字符数。例如,CHAR(30) 最多可以容纳 30 个字符。

它们虽然相似,但存在一些重要区别。

1.区别

根据 MySQL 的官方文档 The CHAR and VARCHAR Types 中的描述, varchar和char的区别主要有:

1.1 存储方式不同

char(N) 定长存储。最多存储 N 个字符,字符数没超出则用空格填充,超过就会被截断,超过的部分丢弃。(如果是严格模式,则会拒绝插入并提示错误信息)

varchar(N) 变长存储。最多存储 N 个字符,没超出则有几个存储几个,超过就会被截断,超过的部分丢弃。(如果是严格模式,则会拒绝插入并提示错误信息)

此外,VARCHAR 在数据前存储为1字节或2字节的长度。长度前缀表示值中包含的字节数。如果值需要不超过255个字节,则列使用一个字节,如果值需要超过255个字节,则使用两个字节。

下表通过显示将各种字符串值存储到 CHAR(4) 和 VARCHAR(4) 列中的结果来说明 CHAR 和 VARCHAR 之间的区别(假设该列使用单字节字符集,如 latin1)。

ValueCHAR(4)Storage RequiredVARCHAR(4)Storage Required
‘’’ ’4 bytes‘’1 byte
‘ab’'ab ’4 bytes‘ab’3 bytes
‘abcd’‘abcd’4 bytes‘abcd’5 bytes
‘abcdefgh’‘abcd’4 bytes‘abcd’5 bytes

表最后一行显示的值仅在不使用严格 SQL 模式时才适用;如果启用严格模式,则不会存储超过列长度的值,并导致错误。

1.2 最大长度不同

char 最大长度为 255 个字符,和字符编码无关。varchar 最大长度为 65,535 字节,注意 varchar 最大长度是字节,因为该上限为行的最大长度。

1.3 尾随空格处理方式不同

char 取出时会将尾随空格去掉,而 varchar 不会。

例如 char(10),保存字符串"hello "(末尾有一个空格),存到数据库就是"hello “(有5个空格),然后查询出来只是"hello”(没有空格),占10个字节。

varchar(10),保存字符串"hello "(有一个空格),存到数据库就是"hello "(有1个空格),查询出来也是"hello "(有1个空格),占 6 个字节。

1.4 读写效率不同

char 存取效率比 varchar 要高,因为其长度固定,数据库系统可以更容易地计算位置和长度。但这也意味着占用更多的磁盘空间,可谓是以空间换时间。

而 varchar 则刚好相反,节省空间但存取效率相对较低。

2.小结

如果你需要固定长度的数据,一般是在存储数据长度差异不大的时候使用 CHAR,但要注意它会浪费存储空间。如果你需要更有效地使用存储空间或处理可变长度的数据,可以使用 VARCHAR。

通常,大部分情况下,VARCHAR更为常见,因为它更节省空间。


参考文献

11.3.2 The CHAR and VARCHAR Types - mysql.com
Section 5.1.11 Server SQL Modes
MySQL中char与varchar的区别:存储机制、性能差异

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值