CHAR和VARCHAR的区别和选择

CHAR和VARCHAR的对比

当我们要存储字符串(较小)的字符串时,MySQL为我们提供了CHAR和VARCHAR两种数据类型。

  • CHAR

    CHAR属于固定长度的字符数据类型,即无论我们实际字符长度是多少,使用CHAR都会以固定长度保存

    CHAR(M)中的M用于指定保存字符的长度,M的范围是0-255个字符,如果直接设置CHAR则默认M为1

  • VARCHAR

    VARCHAR属于可变长的字符数据类型,会根据要保存的字符长度来动态调整占用的空间,VARCHAR(M)中的M用于指定可保存的最大字符长度,范围是0-65535,使用VARCHAR必须指定M

简单来说,CHAR和VARCHAR的相同点就是都可以用来存储中短字符串,例如姓名、文章标题等,同时当我们要存储的字符长度超过M范围后,非严格模式下会截断,而严格模式下会报错。

我们重点来看下他们的不同点。

选项 CHAR(M) VARCHAR(M)
M的范围 0-255 0-65535
M是否必须设置 否,不设置M为1 必须,否则报错
存储数据较小时 右侧填充空格至M 根据数据长度保存
处理速度 相对低
占用空间 相对高

随着MySQL版本的不断升级,VARCHAR数据类型的性能也在不断改进并提高,在InnoDB引擎下建议使用VARCHAR数据类型。

但是对于某些明确知道其长度的列,比如性别(也可以使用enum类型)、身份证号码等,应该使用CHAR类型。

SQL_MODE带来的影响

前面我们说了,CHAR数据类型当保存的数据长度不足M时会在其右侧填充空格以达到指定长度,但是我们查询时似乎并不是这样,来看以下例子:

mysql> CREATE TABLE ts3 ( NAME CHAR(10), wxName VARCHAR(10));
mysql> INSERT INTO ts3 VALUES
    ('张三', '孤狼'),
    ('王小二', '放牛的娃'),
    ('迈克尔杰克逊', '世界舞王');
mysql> SELECT LENGTH(NAME), CHAR_LENGTH(NAME),
        LENGTH(wxName), CHAR_LENGTH(wxName)
        FROM ts3;

查询结果如下

image-20210911160142938

你会发现字符长度竟然不是10?不是说好的使用空格填充吗?别慌,MySQL在查询时会默认帮我们剔除掉末尾的空格,因此我们看到的就是数据实际占用的长度,我们可以通过修改SQL_Mode来改变这种默认行为。

mysql> SET SESSION sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
mysql> SELECT LENGTH(NAME), CHAR_LENGTH(NAME),
        LENGTH(wxName), CHAR_LENGTH(wxName)
        FROM ts3;
image-20210911170110424

可以看到,当我们修改了SQL_Mode后,定长数据类型的列无论实际的数据长度为多少,其字符长度CHAR_LENGTH都为10。

而对于变长数据类型VARCHAR来说,无论SQL_Mode如何修改,都不会影响其长度值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容