数据库字段类型选择

2023/8/16 数据库

数据库字段类型选择

数据库设计一直都是比较复杂的,好的数据库设计能让项目开发起来更加的顺利,无需反复修改,修改数据库表对于开发人员来说真是折磨。 修改数据库表字段,也是一个比较常见的问题,其中修改字段类型可能更为常见,所以这里写一份字段类型参考对照表,如何选择字段类型,减少后期对于数据表的维护,减少数据库内存的开销,合理的选择数据库字段类型。其中也会列出相关的一些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`)
);
1
2
3
4
5

Oracle(没有UNSIGNED,得使用检查约束)

create table t2 (
   id number primary key, 
   constraint t2_uint_id check (id between 0 and 4294967295)
);
1
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)
1

说明

  • 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 说明 文本类型都是用于存储字符串类的数据,具体的不同点主要包含:编码格式、长度、限制 最大长度会依据不同的编码格式而变化,这里只做默认说明