金额字段类型选择
1.decimal
decimal(M,N) 0<M<65,0<N<30,且N<M,M和N的长度直接影响存储空间
默认情况,表示金额的情况,decimal(16,2),范围是99,999,999,999,999.99 to -99,999,999,999,999.99
占用空间为8个字节
存储时会四舍五入
2.bigint
占用空间为8个字节
存储相同大写的数字是,decimal比bigint多1个字节
存入数据库时,decimal会做四舍五入
create table ta (a decimal(4,2),b int);
insert into ta (a,b) values(99.006,9900);
select * from ta;
1 | +-------+------+ |
总结:
1.decimal&bigtin在做计算时,都不会丢失精度(float&double在极端情况下会丢失精度),但是在存入mysql数据库时,decimal会做四舍五入,而int不存在这种情况。
2.金额字段使用decimal类型时,默认单位为元,比较直观,没有歧义
3.金额字段使用bigint时,需要特殊说明单位为分,程序处理时,可以直接使用整数类型long,较通用
4.存储相关大小的金额时(bigint以分为单位),decimal占用空间比bigint微大
综上所诉:建议用bigint来存储金额
时间字段类型选择
1.timestamp
占用4个字节
时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区,对于跨时区跨机房的主从同步有影响
默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间
timestamp容易受mysql sqlmode,timezone参数影响,局限性大
支持范围1970-01-01 08:00:01 ~ 2038-01-19 11:14:07
不推荐使用
2.bigint
占用8个字节
与时区有关,通过System.currentTimeMillis()获取
建立索引之后,查询速度快,条件范围搜索可以使用使用between
支持范围1970-01-01 08:00:01 ~ 2038-01-19 11:14:07 支持精确到毫秒级别
PS: 适合需要进行大量时间范围查询的数据表
3.datetime
占用8个字节
允许为空值,可以自定义值,系统不会自动修改其值
与时区无关
不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据
可以在指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间
支持范围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
总结:
1.性能:bigint性能最高,如果程序有通过时间排序的场景,优势巨大
2.通用性:bigint不受平台限制,所有系统都能通用,不会对后期的升级迁移造成困扰
3.精度:bigint能够精确到毫秒级别,对于高并发,高精度查询,帮助大
4.可读性:bigint不如datetime,开发成本大