关于mysql:万答11MySQL中char与varchar有什么区别

万答#11,MySQL中char与varchar有什么区别

1.试验场景

GreatSQL 8.0.25 InnoDB

2.试验测试

2.1 区别

参数 char varchar
长度是否可变 定长 变长
存储容量 0 ~ 255 0 ~ 65,535

2.2 建测试表

CREATE TABLE vc (v VARCHAR(4), c CHAR(4));

2.3 未超出设定值测试

字段V、C都写入一个4+空格的字符

[root@GreatSQL][test]> INSERT INTO vc VALUES ('4 ', '4 ');

[root@GreatSQL][test]> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (4 )                | (4)                 |
+---------------------+---------------------+
1 rows in set (0.00 sec)

测试后果,char的长度维持不变,占了2个字符,varchar空格长度变了,占了一个字符。

2.4 超出设定值测试

当写入长度大于设定长度时候,呈现报错

[root@GreatSQL][test]>INSERT INTO vc VALUES ('123456', '123456');
ERROR 1406 (22001): Data too long for column 'v' at row 1

调整sql_mode,再写入的时候,主动截取限度容量内的内容

[root@GreatSQL][test]>set session sql_mode="ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

[root@GreatSQL][test]>INSERT INTO vc VALUES ('123456', '123456');            
Query OK, 1 row affected, 2 warnings (0.02 sec)

[root@GreatSQL][test]>select * from vc;
+------+------+
| v    | c    |
+------+------+
| 1234 | 1234 |
+------+------+
1 row in set (0.00 sec)

2.5 字段长度测试

创立表,设置CHAR长度为256, 后果提醒谬误

[root@GreatSQL][test]>CREATE TABLE vc (v VARCHAR(255), c CHAR(256));
ERROR 1074 (42000): Column length too big for column 'c' (max = 255); use BLOB or TEXT instead

3.应用倡议

  • 频繁改变的字段类型倡议应用char。
  • 根本不会变动的字段类型倡议应用varchar类型,这样能够节俭一些存储空间。
  • 如果须要创立索引那么也倡议应用char类型,因为char类型能无效防止因字段变动而产生的索引碎片,进步索引性能。

更多细节请参阅官网:

https://dev.mysql.com/doc/ref…

文章举荐:

技术分享 | MGR最佳实际(MGR Best Practice)
https://mp.weixin.qq.com/s/66…

技术分享 | 万里数据库MGR Bug修复之路
https://mp.weixin.qq.com/s/Ia…

Macos零碎编译percona及局部函数在Macos零碎上运算差别
https://mp.weixin.qq.com/s/jA…

技术分享 | 利用systemd治理MySQL单机多实例
https://mp.weixin.qq.com/s/iJ…

产品 | GreatSQL,打造更好的MGR生态
https://mp.weixin.qq.com/s/By…

产品 | GreatSQL MGR优化参考
https://mp.weixin.qq.com/s/5m…

对于 GreatSQL

GreatSQL是由万里数据库保护的MySQL分支,专一于晋升MGR可靠性及性能,反对InnoDB并行查问个性,是实用于金融级利用的MySQL分支版本。

Gitee:
https://gitee.com/GreatSQL/Gr…

GitHub:
https://github.com/GreatSQL/G…

微信&QQ群:

可扫码增加GreatSQL社区助手微信好友,发送验证信息“加群”退出GreatSQL/MGR交换微信群,亦可间接扫码退出GreatSQL/MGR交换QQ群。

本文由博客一文多发平台 OpenWrite 公布!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理