在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
导读 你真的知道CHAR和VARCHAR类型在存储和读取时的区别吗? 还是先抛几条结论吧: 1、存储的时候,CHAR总是会补足空格后再存储,不管用户插入数据时尾部有没有包含空格。 2、存储的时候,VARCHAR不会先补足空格后再存储,但如果是用户在插入时特地加了空格那就会如实存储,而不会给删除。 3、读取数据时,CHAR总是会删除尾部空格(哪怕是写入时包含空格)。 4、读取数据时,VARCHAR总是如实取出之前存入的值(如果存储时尾部包含空格,就会继续保留着,不会像CHAR那样删除尾部空格)。 下面是测试验证过程。 1、测试CHAR类型 表结构: CREATE TABLE `tchar` ( `id` int(10) unsigned NOT NULL DEFAULT '0', `c1` char(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 插入几条记录: insert into tchar values (1, concat('a', repeat(' ',19))); insert into tchar values (2, concat(' ', repeat('a',19))); insert into tchar values (3, 'a'); insert into tchar values (4, ' '); insert into tchar values (5, ''); 查看存储结构: (1) INFIMUM record offset:99 heapno:0 ... (2) SUPREMUM record offset:112 heapno:1 ... (3) normal record offset:126 heapno:2 ... <- id=1 (4) normal record offset:169 heapno:3 ... <- id=2 (5) normal record offset:212 heapno:4 ... <- id=3 (6) normal record offset:255 heapno:5 ... <- id=4 (7) normal record offset:298 heapno:6 ... <- id=5 看到这坨东西有点懵是不是,还记得我给你们安利过的一个工具不,看这里:innblock | InnoDB page观察利器。 可以看到,无论我们存储多长的字符串进去,每条记录实际都是占用43(169-126=43)字节。由此结论1成立。 再看下读取tchar表的结果: select id,concat('000',c1,'$$$'),length(c1) from tchar ; +----+----------------------------+------------+ | id | concat('000',c1,'$$$') | length(c1) | +----+----------------------------+------------+ | 1 | 000a$$$ | 1 | <- 删除尾部空格 | 2 | 000 aaaaaaaaaaaaaaaaaaa$$$ | 20 | | 3 | 000a$$$ | 1 | | 4 | 000$$$ | 0 | <- 删除尾部空格,结果和id=5一样 | 5 | 000$$$ | 0 | +----+----------------------------+------------+ 2、测试VARCHAR类型 表结构: CREATE TABLE `tvarchar` ( `id` int(10) unsigned NOT NULL DEFAULT '0', `c1` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 插入几条记录: insert into tvarchar values (1, concat('a', repeat(' ',19))); insert into tvarchar values (2, concat(' ', repeat('a',19))); insert into tvarchar values (3, 'a'); insert into tvarchar values (4, ' '); insert into tvarchar values (5, ''); insert into tvarchar values (6, ''); 查看存储结构: (1) INFIMUM record offset:99 heapno:0 ... (2) SUPREMUM record offset:112 heapno:1 ... (3) normal record offset:126 heapno:2 ... <- id=1 (4) normal record offset:169 heapno:3 ... <- id=2 (5) normal record offset:212 heapno:4 ... <- id=3 (6) normal record offset:236 heapno:5 ... <- id=4 (7) normal record offset:260 heapno:6 ... <- id=5 (8) normal record offset:283 heapno:7 ... <- id=6 可以看到,几条记录的字节数分别是:43、43、24、24、23、23(最后一条记录和id=5那条记录一样)。 再看下读取tvarchar表的结果: select id,concat('000',c1,'$$$'),length(c1) from tvarchar; +----+----------------------------+------------+ | id | concat('000',c1,'$$$') | length(c1) | +----+----------------------------+------------+ | 1 | 000a $$$ | 20 | <- 读取结果中没有删除尾部的空格 | 2 | 000 aaaaaaaaaaaaaaaaaaa$$$ | 20 | | 3 | 000a$$$ | 1 | | 4 | 000 $$$ | 1 | <- 读取结果中没有删除此空格 | 5 | 000$$$ | 0 | | 6 | 000$$$ | 0 | +----+----------------------------+------------+ 总的来说,可以总结成两条结论: 最后,来看下文档里怎么说的:
以上测试使用的版本及环境: mysql> select version()\G ... version(): 8.0.15 mysql> select @@sql_mode\G ... @@sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 参考文档 11.4.1 The CHAR and VARCHAR Types,https://dev.mysql.com/doc/refman/5.7/en/char.html 以上就是MySQL CHAR和VARCHAR存储的差别的详细内容,更多关于MySQL CHAR和VARCHAR的资料请关注极客世界其它相关文章! |
请发表评论