总结了几条数据库表设计需要注意的问题。首先有两个问题需要了解一下,一是mysql和java类型之间的对应关系,二是宽度这个概念。
一:Mysql和Java数据类型对应关系
整数类型:
数据库类型 | 长度(数据大小) | 逆向工程生成java实体类属性类型 | 描述 |
tinyint | 1字节 | Byte | 2^8 带符号的范围是-128到127。无符号的范围是0到255 |
smallint | 2字节 | Short | 2^16 带符号的范围是-32768到32767。无符号的范围是0到65535 |
mediumint | 3字节 | Integer | 2^24 |
int | 4字节 | Integer | 2^32 |
bigint | 8字节 | Long | 很大 |
实数类型(整数和小数):
数据库类型 | 逆向工程生成java实体类属性类型 |
float | Float |
double | Double |
decimal | BigDecimal |
1,其中tinyint的宽度设为1时生成的java类型是Boolean,因为只有boolean的展示宽度是1,所以在用tinyint表示状态时,可以用unsigned tinyint(2)类型。
2,使用mybatis自定义查询方法时(即自己在xml文件写sql语句),如果mysql里的数据是tinyint的且没有定义返回的数据类型,那么返回的数据会是Integer类型的,尽量不要使用HashMap和HashTable作为返回类型,类型不可控。
二:宽度
概念:例如 `status` tinyint(2) DEFAULT '1' 这句建表语句中的2就是宽度。也就是属性后括号内的数字叫做数据的宽度,在navicit等一些工具的设计页面里的名字是 '长度',不同的数据类型对宽度处理不同。
数字类型:这里的宽度和数据的取值范围没有任何关系,数据的取值范围只与数据类型有关,只是指明mysql最大可能显示的数字个数。如果你不设置宽度,系统将添加默认的宽度 tinyint(4),smallint(6),mediumint(9),int(11),bigint(20)。这些默认的宽度是跟该类型的取值范围长度相关。另外,像float,double和decimal这三种实数类型,括号内还有第二个数字表示精确到多少位。
字符串类型:这个长度就与取值范围有关了,不管是char还是varchar都定义了字符串的最大长度,宽度设为几就只有几个汉字(5.0版本后)。
text,浮点和日期:对宽度没有要求,不设置,默认0
三:表设计规范
1,主键要用bigint unsigned类型。单表时自增,步长为1。
2,如果存储的字符串长度几乎相等,用char定长字符串类型。
char(m)存储m个字节,是定长的,最大255;varchar(m)可以存储0到m-1个字节,是可变长字符串,不预先分配存储空间,最大65535,要节省空间,用最小的空间即可。在mysql 4.0版本里 char(m)中 m 是字节,按照utf8字符集,最大存储85个汉字,在 5.0版本 m 是字符,最大存储255个汉字。
3,任何的Boolean类型的POJO字段都不要用is做前缀,会导致orm框架识别错误;但数据库表示是否的字段都要用is前缀,所以要在resultMap中改一下映射。
4,表名不要用复数。
5,小数类型使用decimal类型,不要使用double或float类型。
6,如果含有文字表情,mysql字符集一律使用utf8mb4,不要使用uft8。
utf8mb4一个字符用四个字节表示,uft8一个字符用三个字节表示,有些表情无法显示。
7,能用小的类型就用小类型,确定不会是负数加上unsigned。