共计 2008 个字符,预计需要花费 6 分钟才能阅读完成。
万答 #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 公布!