前言
想起来前几年在某东XXX部门的面试的时候,面试官考察了这样一个面试题:根据一个场景设计数据库和一些简单的 SQL 查询的语句。其实还算是一个很简单的工作。但当时他还问了我一个问题:某字段的字符串类型长度为什么要给它10呢?
整数类型
整数数据类型有五个:tinyint ,smallint ,mediumint , int ,bigint ,但平常使用比较多可能就是 int(n) 。其中 n 表示的是占位宽度。
占位宽度?不太理解这个定义是什么?是不是指最大允许显示数字的长度呢?下面通过数据库简单实践下看看是什么样的结果。
设置某个字段,整型且设置为填充零。
当给 userCode 设置值为12 时,会自动填充2位零,当设置为11111时就没有填充零,也没有减少位数,还是5个1的长度
所以很明显,这个占位宽度其实就是显示长度,如果数据宽度小于 n 时就会自动补零,但它如果大于 n 时就会正常显示。
那 n 会限制存储吗?答案是不会。int 类型占用空间是 4 个字节,无论 n值是多少,其占用的空间还是4个字节,不会因为 n 变化而影响。因为我们存储数据在电脑磁盘中其实最终的存储都是以0和1组成串进行存储的。每一个0或者1都是成为1位。1个字节=8位,所以整型 int 4个字节,差不多允许支持32位。
所有由 32位0或1 可以组合出来情况有 232 ,这个就是 int 类型允许的取值范围(无符号)。如果是有符号的,第一位是表示符号,取值范围就是-2-31~231 -1。所以只要值在这个范围内,n 长度无论多长多短,短了补零,长了还是不变。长度 N和存储完全没关系。
字符串类型
数据库中字符串类型只有两种:CHAR(n) 和 VARCHAR(n)。其中 n 表示的是该字段最大可容纳的字符数。简单说就是字符长度。
像字母、数字、运算符号、标点符号和其他符号都是表示字符。字符串就是由字符组成的。可以通过数据库实践一下,设置某个字段为字符串类型,varchar(10)。再 insert 一个长度大于10的字符串时就会报错:“Data too long for column xxxx ”。
所以字符串的 n 和整型还是不一样的。需要注意:字符不是字节。
所以遇到一开始说的那个问题时,个人觉得回答还是要根据场景来回答:比如可能一个code 长度不需要太长可以设置 n=10;name 的值都不会太长时,长度可以设置为 50 。为什么要设置长度为10就是因为考虑该字段存的长度不会超过10位。
参考资料: