数据库设计——smallint(5) VS varchar(5)

一个比较有意思的case,写出来自嘲一下。背景很简单,同事调用我方创建账单接口,创建失败,查日志显示

Data truncation: Out of range value for column 'channel' at row 1

明显,对方传入的channel字段超过了smallint的最大值。(业务上该值不会超过smallint最大值,对方误传告终)。于是笔者顺手百度了两个点

1、smallint的最大值。答案从 -2^15 到 2^15 即(-32768到32767) 的整型数据

2、Db字段中,5的具体含义,同理bigint(20)的20,varchar(255)中的255.这些db设计时经常出现的数字都是限长么?答案no。

正解:

1)对于int类型而言,括号中的数字只是补位数字,对该字段所表示的取值范围并没影响,这个补位的数字只有当你设置该字段为zerofill的时候才会体现差别;

测试验证:非zerofill类型(建表语句,非zerofill时,插入数据查询结果显示如下:)

 数据库设计——smallint(5) VS varchar(5)

修改id为zerofill类型后

 数据库设计——smallint(5) VS varchar(5)

可以看出在将bigint类型的id设置为bigint(20) zerofill后,id值自动左补齐20;此时再insert id到bigint的max值,9223372036854775807也成功插入。说明bigint(20)的含义非用于限制bigint的长度,而是限制宽度。

2)对于varchar类型varchar(50)中的50表示的是varchar数据的数据长度最大是50,超过则数据库不会存储.这个

3)总结

      int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据(限宽度);

      varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存储(限长度);对于VARCHAR数据类型来说,硬盘上的存储空间是根据实际字符长度来分配存储空间的,而对于内存来说,是使用M个字符空间的内存块来保存该字段对应value值,即varchar(50)占用50个字符内存空间,varchar(100)占用100个字符内存空间。

    本来不想发表这么智障的文章,问了好几个人,居然都不知道。发出来吧。哈哈。仰望星空还得脚踏实地啊~