之前建表都是参考别人的表来建的,自己很少去思考为什么那么建,以实现功能为目的,最近接到了曹操出行和E代驾的新需求,需要自己建一张出行订单的表用来记录订单信息,于是总结了下建表时需要注意的地方。
MySQL数据类型和Java中实体类的映射关系
整数类型
计算机原理中我们知道,字节(byte)并非是计算机存储的最小单位, 还有比字节(byte)更小的单位, 也就是位(bit),一个位就代表一个二进制位0或1,8个位组成一个字节;,一般字节用大写B来表示byte, 位用小写b来表示bit.根据int类型允许存储的字节数是4个字节(即4B=32b, 最大值即为32个1组成), 我们就能换算出int UNSIGNED(无符号)类型的存储范围就是 0~2^32,能存储的最小值为0, 最大值为4294967295,如果带符号位的话就是 -2^31 ~ 2^31-1 。整数类型有可选的 unsigned 属性,表示不允许负值,这大致可以使正数的上限提高一倍。主键自增 id 适合设置为 unsigned 属性的 int 类型。
计算机存储单位的换算:
1B=8b
1KB=1024B
1MB=1024KB
整数类型指定宽度的理解
先来看一个示例,我定义了一个tinyint类型的平台字段,然后我指定长度为1,如果是长度为1的字符串类型的话应该是只能输入一个字符的,然而指定长度为1的整形类型确能输入超过一位的数。
发现最大可以输入到127,因为有符号的tinyint最大为127
MySQL 可以为整数类型指定宽度,例如 int(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具(例如 MySQL 命令行客户端)用来显示字符的个数。对于存储和计算来说,int(1) 和 int(20) 是相同的。
其实当我们在选择使用int的类型的时候,不论是int(1)还是int(20),它在数据库里面存储的都是4个字节的长度,这个int(M)中的M只是规定了数据的宽度,如果你选择了Zerofill属性,就能更好地理解这个1了,如果我们写入的数据达不到这个长度,那么就会在数据前面补0来达到这个长度。比如我们将int(1)改成int(3),我们再输入1,实际上显示的是001。所以不管你将 int 类型的长度设为多少并不会影响数据的存储范围。