今天在测试机上做了下叶老师说的案例,尝试了解下MySQL在varchar类型和char类型字段对于字符串中空格的存取机制。
首先我们创建一张测试表:
root@127.0.0.1:3306 [xucl]>create table xucl(id int auto_increment,col1 varchar(4),col2 char(4),primary key(id));
Query OK, 0 rows affected (1.02 sec)
插入几条测试数据:
root@127.0.0.1:3306 [xucl]>insert into xucl(col1,col2) values('a','b');
Query OK, 1 row affected (0.01 sec)
root@127.0.0.1:3306 [xucl]>insert into xucl(col1,col2) values('a ','b');
Query OK, 1 row affected (0.02 sec)
root@127.0.0.1:3306 [xucl]>insert into xucl(col1,col2) values('a','b ');
Query OK, 1 row affected (0.00 sec)
root@127.0.0.1:3306 [xucl]>insert into xucl(col1,col2) values('a ','b ');
Query OK, 1 row affected (0.00 sec)
查询表内数据:
root@127.0.0.1:3306 [xucl]>select * from xucl;
+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1 | a | b |
| 2 | a | b |
| 3 | a | b |
| 4 | a | b |
+----+------+------+
4 rows in set (0.00 sec)
从结果上看,用肉眼并看不出什么区别,那我们用另外一种方式来查看
root@127.0.0.1:3306 [xucl]>select id,concat('(',col1,')'),concat('(',col2,')') from xucl;
+----+----------------------+----------------------+
| id | concat('(',col1,')') | concat('(',col2,')') |
+----+----------------------+----------------------+
| 1 | (a) | (b) |
| 2 | (a ) | (b) |
| 3 | (a) | (b) |
| 4 | (a ) | (b) |
+----+----------------------+----------------------+
4 rows in set (0.00 sec)
再看下每个字段存储的长度
root@127.0.0.1:3306 [xucl]>select length(col1),length(col2) from xucl;
+--------------+--------------+
| length(col1) | length(col2) |
+--------------+--------------+
| 1 | 1 |
| 2 | 1 |
| 1 | 1 |
| 2 | 1 |
+--------------+--------------+
4 rows in set (0.00 sec)
这样看就很明显了,
char类型会将字符串后面的空格去掉存储,读取的时候也会将空格去掉。
varchar类型就不一样了,varchar在存储和读取的时候会带上空格,在实际生产中需要注意这两者的区别,避免采坑,不要排查半天看不出来数据有啥区别,其实就是因为这“隐形”的空格导致的。