原文链接:https://www.xygalaxy.com/navLink/blog/article/fc9d50688efb432ca5f4ce309bc8ac98
推荐个导航网站(强烈推荐):https://www.xygalaxy.com/
前言
数据库设计一直都是比较复杂的,好的数据库设计能让项目开发起来更加的顺利,无需反复修改,修改数据库表对于开发人员来说真是折磨。
修改数据库表字段,也是一个比较常见的问题,其中修改字段类型可能更为常见,所以这里写一份字段类型参考对照表,如何选择字段类型,减少后期对于数据表的维护,减少数据库内存的开销,合理的选择数据库字段类型。其中也会列出相关的一些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`)
);
Oracle(没有UNSIGNED,得使用检查约束)
create table t2 (
id number primary key,
constraint t2_uint_id check (id between 0 and 4294967295)
);
整型数据类型参照表
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
说明
文本类型都是用于存储字符串类的数据,具体的不同点主要包含:编码格式、长度、限制
最大长度会依据不同的编码格式而变化,这里只做默认说明
- CHAR
- 定长字符串,CHAR字段上索引效率极高,但是不适用于字符长度不确定的数据
- CHAR(10),插入一个长度为10个字节的字符串,不够会在前面自动补充空格,无论长度是否够10个字节的空间,都会占用10个字节的空间
- 长度超过限制无法插入
- 最大长度:CHAR(255)
- 使用场景:已确定字段长度
- VARCHAR
- 变长字符串,存储效率低于CHAR,但是平常用的比较多
- VARCHAR(10),插入一个小于10个字节的字符串,字符串长度为2个字节则只占用两个字节
- 长度超过限制无法插入
- 最大长度:VARCHAR(65535)
- 使用场景:大多数场景都用这个,只要长度够存储都可以用这个
- TEXT
- 存储数据类型:可变长度的非Unicode字符数据数据
- 最大长度:2^16-1个字符
- 使用场景:
- MEDIUMTEXT
- 存储数据类型:可变长度的非Unicode字符数据数据
- 最大长度:16777215 (2^24-1) 个字符
- 使用场景:
- LONGTEXT
- 存储数据类型:可变长度的非Unicode字符数据数据
- 最大长度:2147483647 (2^32-1) 个字符
- 使用场景:
- TINYTEXT
- 存储数据类型:可变长度的非Unicode字符数据数据
- 最大长度: 255 (2^8-1) 个字符
- 使用场景:
- BLOB
- 存储数据类型:二进制数据
- 最大长度: 65k
- 使用场景:
- TINYBLOB
- 存储数据类型:二进制数据
- 最大长度:255k
- 使用场景:
- MEDIUMBLOB
- 存储数据类型:二进制数据
- 最大长度:16M
- 使用场景:
- LONGBLOB
- 存储数据类型:二进制数据
- 最大长度:4G
- 使用场景:
补充
- NCHAR、NVARCHAR、NTEXT
- 前面几种类型前加N。它表示存储的是Unicode数据类型的字符
说明
-
unicode字符集是为了解决字符集不兼容的问题而产生的,所有字符都用两个字节表示,即英文字符也用两个字节表示。
-
以上的最大长度都是指字节长度,而非字符个数,如char(1)就连一个汉字都不能存放。
Oracle:数据类型和Mysql有些区别,提供的文本类型:char、nchar、varchar2,nvarchar2、long、clob、blob、bfile
- char
- 定长字符类型(未达到指定长度时,自动在末尾用空格补全);默认值为1;最大2000字节;非unicode。
- nchar
- 定长字符类型(未达到指定长度时,自动在末尾用空格补全);默认值为1;最大1000字节;根据unicode,所有字符都占两个字节。
- varchar2
- 变长字符类型(未达到指定长度时,不自动补全空格);定义时需指定长度;最大为4000字节;非unicode。
- nvarchar2
- 变长字符类型(未达到指定长度时,不自动补全空格);定义时需指定长度;最大为2000字节;根据unicode,所有字符都占两个字节。
- long
- 大文本类型,用于存储变长字符串,最大长度为2GB。这是为了与早期版本兼容而保留的字符类型。
- clob
- 存储字符,最大可以存4G
- 用于存储单字节或多字节的大型字符串对象,支持使用数据库字符集的定长或变长字符。在 Oracle 12c中 CLOB 类型最大存储容量为128TB。
- blob
- 存储图像、声音、视频等二进制数据,最大可存4G
- 用于存储大型的、未被结构化的变长的二进制数据,如二进制文件、图片文件、音频和视频等非文本文件。在 Oracle 12c中 BLOB 类型最大存储容量为128TB。
- bfile
- 用于存储指向二进制格式文件的定位器,该二进制文件保存在数据库外部的操作系统中。在 Oracle 12c中 BFILE 文件最大容量为128TB,不能通过数据库操作修改 BFILE 定位器所指向的文件。
danger 补充提示
Oracle还有一些其他的数据类型,日常工作可能用的比较少,有需要自行查找,如有遗漏的这里不再做补充,自行查找。
二进制类型:ROW、LONG ROW
行类型:ROWID
日期与时间
日期与时间类型参照表
MySql:提供的日期与时间有以下几种类型:YEAR、TIME、DATE、DATETIME、TIMESTAMP
字段类型 | 日期格式 | 范围 | 大小(字节) | 理解说明 |
---|---|---|---|---|
YEAR | YYYY | 1901~2155 | 1 | 只需要记录年份的可选 |
TIME | HH:MM:SS | -838:59:59~838:59:59 | 3 | 只需要记录时间的可选 |
DATE | YYYY-MM-DD | 1000-01-01~9999-12-3 | 3 | 只需要记录日期的可选 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8 | 最常用,如果对于时间精度只需要到秒的都可选,如果没要求,直接选这个就好了 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC~2038-01-1903:14:07 UTC | 4 | 受时区限制,会受数据库时区的影响,有范围限制,其他和DATETIME差不多 |
精确到毫秒
-
TIME、DATETIME、TIMESTAMP都是支持毫秒格式的,可以精确保存到毫秒,毫秒部分需要以参数形式传参给数据类型,默认是不保存毫秒的,可以保存1-6位。
-
参数形式:TIME(q)、DATETIME(q)、TIMESTAMP(q),p默认不设置则不保存毫秒,范围:0<q<=6
-
数据类型设置:TIME(3)、DATETIME(3)、TIMESTAMP(3),意思都是保留毫秒3位,最大可以保存6位。
-
类型选择:如果对于日期范围没什么限制,一般选用:TIMESTAMP,因为占用字节小,但不在乎这点内存,可以直接用DATETIME,其他所有的都可以选择DATETIME,这个是最通用的,当然还有些是将日期是设置为字符串的,这个就不推荐使用了,还是使用DATETIME好。
Oracle:提供的日期与时间有以下几种类型:DATE、TIMESTAMP
- DATE
- 日期格式:YYYY/MM/DD、YYYY/MM/DD HH24:MI:SS,存储格式只有:YYYY/MM/DD HH24:MI:SS
- TIMESTAMP
- 日期格式:YYYY/MM/DD HH24:MI:SS.sss
- 与DATE没什么区别,只是精确到的位数不一样
- 格式:TIMESTAMPL(q),q 表示秒的小数位数,取值范围为0~9
- 精确到秒的小数点后9位。表示时间戳,是 DATE 数据类型的扩展,允许存储小数形式的秒值。 p 表示秒的小数位数,取值范围为0~9,默认值为6。根据 p 值的设置不同, TIMESTAMP 类型数据占据7~11B空间,由世纪、年、月、日、时、分、秒组成,如30-MAY-1207.56.07.544000PM。
warning 数据库设计一些建议
-
能用小存储的尽量用小存储字段,比如:能用TINYINT尽量不用INT
-
能确认字段大小的就确认好字段大小,不能确认字段的,考虑极端情况,给最大的类型和大小,以免后期维护
-
字段考虑基本信息:创建人、创建时间、更新人、更新时间、状态、类型、是否逻辑删除、ID存储类型是UUID字符串、自增数值还是序列,考虑优缺点
推荐一个数据库设计软件
PDMan数据库建模官网
标签:字符,存储,字节,数据库,数据类型,选择,类型,长度 From: https://www.cnblogs.com/ONLYZYLY/p/17119843.html也可以直接在银河系XYGALAXY中直接搜索下载