数据库字段类型选择
数据库字段类型选择
数据库设计一直都是比较复杂的,好的数据库设计能让项目开发起来更加的顺利,无需反复修改,修改数据库表对于开发人员来说真是折磨。 修改数据库表字段,也是一个比较常见的问题,其中修改字段类型可能更为常见,所以这里写一份字段类型参考对照表,如何选择字段类型,减少后期对于数据表的维护,减少数据库内存的开销,合理的选择数据库字段类型。其中也会列出相关的一些MySQL和Oracle的区别。
# 数据库类型分类
- 整型
- 浮点数与定点数
- 文本
- 日期与时间
# 整型
无符号和有符号的区别无符号:无符号(unsigned)表示设置的的数据为0或者正数;
有符号:有符号则可以是负数
现在的数据库软件工具默认都是有符号的,如何设置为无符号?
MySQL(关键字:UNSIGNED)
CREATE TABLE `t1` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`val` int UNSIGNED NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`)
);
2
3
4
5
Oracle(没有UNSIGNED,得使用检查约束)
create table t2 (
id number primary key,
constraint t2_uint_id check (id between 0 and 4294967295)
);
2
3
4
MySQL:提供了以下几种整型数据类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,依据使用场景进行选择即可
类型名称 | 有符号型取值范围 | 无符号型取值范围 | 存储大小 | 理解说明 |
---|---|---|---|---|
TINYINT | -128~127 | 0~255 | 1个字节 | 只有几个类型时一般选择该类型,例如数据字典、枚举数据都不会太多,可以选择这个类型,例如:性别、状态、是否等 |
SMALLINT | -32768~32767 | 0~65535 | 2个宇节 | 可用于比较小的一些数据统计,但注意范围,例如公司电脑设备数量,但如果是大公司可能这个数量就会超过,就尽量选择更大的整型 |
MEDIUMINT | -8388608~8388607 | 0~16777215 | 3个宇节 | 可用于更大的数据统计,例如火车站单日人流量统计等 |
INT | -2147483648~2147483647 | 0~4294967295 | 4个宇节 | 可用于大返回比较广,一般能用前面几种的整型的这个都能用,但是为了能不浪费内存,还是能选择比较小的类型还是选择小一点的好 |
BIGINT | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 | 8个宇节 | 只有处理特别大的数据量统计才会用到,例如双十一成交量,全球人数统计等 |
Oracle:没有对应的整型类型,它只有数值类型:NUMBER,NUMBER数据类型可以存储正数,负数,0,定点数和精度为38为的浮点数,具体是使用场景依据自己的需求制定即可
number(p, s)
说明
p:表示精度,表示有效的位数,在1~38之间。有效数:从左边第一个不为0的数算起,小数点和负号不计入有效数。
s:为范围,表示小数点右边数字的位数,它在-84 ~ +127之间。
规则:p大于等于s,精确到小数点右边S位也就是小数部分,超出的四舍五入。如果精确后的有效位数小于等于p,则正确,否则报错。
使用
具体使用 | 理解说明 |
---|---|
number(1) | 一位整数,可用于基本的枚举等,例如:性别、状态、是否等,不超过2位数 |
number(10) | 10位数的整数,用于比较大的数据统计等,相当与MySQL中的INT |
number(3,3) | 3位整数位,3位小数位,小数位不够补0,小数位超过4位则四舍五入,例如:125.200,152.123、155.1267->155.1268 |
number(3,4) | 报错:不满足规则p大于等于s |
number(38,15) | 可用于股票交易计算等大精度的数据,银行账户余额等 |
# 浮点数与定点数
浮点数与定点数类型参照表MySQL:提供的浮点型与定点数有以下几种类型:FLOAT、DOUBLE、DECIMAL
类型名称 | 描述 | 存储大小 | 理解说明 |
---|---|---|---|
FLOAT | 单精度浮点数 | 4个字节 | 浮点数缺点精度不精确,会有误差,对精度要求高的不适用,适用场景如:温度、计算化学、身高体重等,对于数据的大小范围在:±131072(65536×2),都可以选择该类型,限制位数用法:float(m,d),其中m最大为8位精度(4个字节),,例如:float(5,2),浮点数最大长度为5,小数部分为2位,根据有无符号范围大小为:无符号(-99999.9至99999.9),有符号(0.0-99999.9) |
DOUBLE | 双精度浮点数 | 8个宇节 | 浮点数缺点精度不精确,会有误差,对精度要求高的不适用,用法同FLOAT一样,使用场景根据所需大小选择,大小范围:double(m,d) 其中m最大16位精度(8字节) |
DECIMAL | 16进制定点数 | 3个宇节 | 高精度,选用场景:银行金额、有关金融类的都可以选中该字段,decimal(m,d),其中m<65 是总个数,d<30且 d<m 是小数位。 |
Oracle:参考Number即可,Oracle 没有浮点数这个概念。
# 文本
文本数类型参照表MySQL:提供的文本类型:CHAR、VARCHAR、TEXT、MEDIUMTEXT、LONGTEXT 、TINYTEXT 、BLOB、TINYBLOB、MEDIUMBLOB、LONGBLOB 说明 文本类型都是用于存储字符串类的数据,具体的不同点主要包含:编码格式、长度、限制 最大长度会依据不同的编码格式而变化,这里只做默认说明