星空

人生不仅有眼前的苟且,还有诗和远方.

0%

MySQL特殊字段类型选择

金额字段类型选择

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
2
3
4
5
6
7
8
9
10
+-------+------+

| a | b |

+-------+------+

| 99.01 | 9900 |

+-------+------+

总结:

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,开发成本大