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;
查询结果如下
你会发现字符长度竟然不是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;
可以看到,当我们修改了SQL_Mode后,定长数据类型的列无论实际的数据长度为多少,其字符长度CHAR_LENGTH都为10。
而对于变长数据类型VARCHAR来说,无论SQL_Mode如何修改,都不会影响其长度值。