数据库字段类型CHAR和INT

1、VARCHAR (50) 中的 50 到底是能存 50 个字还是50 个字节

mysql root@(none):imooc_mysql_interview> create varchar_test(clo_1 varchar(8));
mysql root@(none):imooc_mysql_interview> insert into varchar_test values("123456789")
(1406, "Data too long for column 'clo_1' at row 1")
mysql root@(none):imooc_mysql_interview> insert into varchar_test values("12345678")
Query OK, 1 row affected
Time: 0.006s
mysql root@(none):imooc_mysql_interview> insert into varchar_test values("数一数是不是八个");
Query OK, 1 row affected
Time: 0.005s

从上述实验的结果可知,显然是能存 8 个字符而不是 8 个字节,也就是说 VARCHAR 的括号中的数字代表的是字符。

2、CHAR (50) 和 VARCHAR (50) 有什么区别?

首先要说明的一点, CHAR 和 VARCHAR 在存储方式上存在着差异: CHAR是定长字符, MySQL 数据库会根据建表时定义的长度给它分配相应的存储空间。
而 VARCHAR 是可变长度字符的数据类型,在存储时只使用必要的空间。

举个例子,假如一张表上有两列,分别是 CHAR (20) 和 VARCHAR (20),我们插入一个字符串 “abcd”,在数据库中存储时, CHAR 会使用全部的 20 个字符
的长度,不足的部分用空格填充,而 VARCHAR 仅仅就只使用 4 个字符的长度。

其次,由于 CHAR 数据类型的这个特性,在将数据写入表中时, 如果字符串尾部存在空格,会被自动删除,而 VARCHAR 数据类型会保留这个空格。在一些
特殊场景中要注意这个问题。所以推荐你使用 CHAR 数据类型存储一些固定长度的字符串,比如身份证号、手机号、性别等。

最后, CHAR 和 VARCHAR 的存储长度不同。 CHAR 数据类型可定义的最大长度是 255 个字符,而 VARCHAR 根据所使用的字符集不同,最大可以使用65535 个字节

mysql root@(none):imooc_mysql_interview> alter table varchar_test add col_2 char(256) NULL DEFAULT '';
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
(1074, "Column length too big for column 'col_2' (max = 255); use BLOB or TEXT instead")
mysql root@(none):imooc_mysql_interview> alter table varchar_test add col_2 varchar(65535) NULL DEFAULT '';
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
(1074, "Column length too big for column 'col_2' (max = 16383); use BLOB or TEXT instead")

可以看出,char数据类型可定义的最大长度是 255 个字符。超过255系统会提示错误。varchar数据类型最大可以使用65535 个字节,常用中文字符用utf-8编码占用3个字节(大约2万多字),但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字),65535/4=16383

3、VARCHAR 数据类型优化

虽然使用 VARCHAR (50) 和 VARCHAR (1000) 存储‘abcd’的存储空间开销是一样的,但是当你在读取数据时,把这些数据读取到内存的过程中, MySQL 数
据库需要分配相应大小的内存空间来存放数据。

所以更大的 VARCHAR 列在读取时要使用更大的内存空间,即使它实际上只存储了一丁点数据。并且在操作这个表的过程中,如果遇到一些聚合(GROUP BY)或排序(ORDERBY)的操作,需要调用内存临时表或磁盘临时表时,性能会更加糟糕。

因此, 在保留一定冗余的前提下,只给 VARCHAR 分配恰到好处的空间使用

4、INT、 INT (1)、和 INT (20)

INT 定义中的数字只是表示显示宽度,它并不限制 MySQL 的实际存储空间。因此在开发工作中不要把 INT (1) 当初 TINYINT 来用,也千万不要把 INT (20)
当成 BIGINT 用。

对于 UNSIGNED 这个属性,最适合的场景就是主键自增值,或者一些不允许出现负数的应用中。在使用时要注意带有 UNSIGNED 的字段,在做计算时如果出
现负数可能会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值