小伙伴们
我们继续搞数据库
今天分享的是数据库的数据类型
首先来看一下图
MySQL数据库的数据类型主要是分为数值型,日期时间型以及字符串型这三个大类,看着很多觉得记不住很麻烦是不是,不用担心其实现在我们常用的就那么几个
整数型的 tinyint 和 bigint
小数型的 decimal
日期时间类型 datetime 和 timestamp
字符串型是 char 和 varchar
这样看起来是不是就没有那么多了呢?
数值型
整数型
是否有符号,可在定义时使用unsigned标识,
如果没有,不写就认为是有符号。
我们直接上手试验一下
先把建表的语句写好
create table tb1_int(
a tinyint unsigned,
b tinyint
);
insert into tb1_int values(255, 127);
insert into tb1_int values(256, 128);
insert into tb1_int values(0, 128);
创建一个表向表中插入数据
第一条语句插入成功
第二条语句
失败 :a列的值超出范围
第三条
失败:b列的值超出范围
整数型就验证这一个例子哈!
在这边给大家扩充一个小知识点!
zerofill
通过规定数据的显示宽度,达到统一显示的目的
语句:
alter table tb1_int add c tinyint(3) zerofill;
insert into tb1_int values(0, 127, 1);
insert into tb1_int values(0, 127, 5);
insert into tb1_int values(0, 127, 7);
alter table tb1_int add c tinyint(3) zerofill;
类型(M), M表示显示的最小宽度
效果:
java中的 boolean 类型, 在数据库中可以用 bit, tinyint(1),来存储
0对应false 1 对应true
整数类型中最常用的是:
tinyint , int 对应 java 中的 int
bigint 对应 java 中的 long
小数类型
语句:
单精度
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
双精度
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
利用 M,D 控制数值范围;支持无符号;可以zerofill;
其中 M 表示总的位数,D 表示小数位数。此 M,D 可以控制保存的范围。
例:Float(10,2) -{}.99 到 {}.99
如果省略 M,D 会根据计算机硬件进行处理。
单精度,M大约为7左右
而双精度,M大约为15左右
科学计数法
-3.{}E+38 = -3.{} * 10^38
123.456 在磁盘上是如何存储的?
0.{} * 10^3 实际上存储的是: {} 3
这样存储会出现了精度的丢失。
我们来验证一下
create table num_1(
a float,
b double
);
insert into num_1 values({}.0{}, {}.0{});
效果:
Float 精度为6位左右。 Double的精度为16位左右。
因为 float 和 double 会出现精度的丢失,所以在精确度要求高的场所用 decimal。
Decimal 定点数型
定点数
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
其中M表示总的位数,D表示小数位数。此M,D可以控制保存的范围。
M,D省略,默认为10,0;
create table num_2(
send_money decimal(6,2)
);
insert into num_2 values(9999.99);
效果:
所以要是小伙伴们以后要存储一些涉及到钱的数据要记得 用Decimal
decimal 对应 java BigDecimal java.math.BigDecimal
日期时间类型
这边就不一一介绍了
Timestamp 时间戳:存储的时候是整型,显示的时候是日期类型
至于为什么时间戳的最大值是2038年小伙伴们自己去百度吧!蛮有意思的呢!
create table dt_1(
a datetime,
b timestamp
);
insert into dt_1 values('2017-11-04 19:20:00', now());
效果:
datetime 对应 Java Date
字符类型
blob 对应 java byte[]
enum 对应 java 里 Enum 枚举类型
set 对应 java里 set 类型
char varchar text : 对应 Java String
Char & varchar
CHAR 和 VARCHAR 类型声明的长度表示你想要保存的最大字符数。
Char(5) Varchar(5)
Char :
定长字符串,保存时如果字符串长度不够,则后边补足空字符串;但是在读取到数据是,会截取后边所有的字符串。
Varchar :
变长字符串。在保存字符串时,同时保存该字符串的长度,小于255采用一个字节保存,否则采用二个字节保存。
text 就是储存长文本类型
char、varchar 和 text 总结:
经常变化的字段用 varchar
知道固定长度的用 char
超过255字符的只能用 varchar 或者 text
能用 varchar 的地方不用 text
我们再来看一下枚举类型 里面实际上存储的就是整形,例如我们规定存储 boy和 girl 里面实际存储的是1和2
create table s_8(
gender enum('boy', 'girl')
);
insert into s_8 values('girl');
insert into s_8 values('boy');
insert into s_8 values('other');
效果:
在枚举类型中我们只能插入写好的内容
set是一个集合类型!
create table s_6(
hobby set('A', 'B', 'C')
);
insert into s_6 values('A');
insert into s_6 values('B,C');
效果:
在 set 类型我们可以多选
blob 是存储的是二进制类型,图片 文件 视频 音频都可以用这个存储,但在实际应用中我们一般会把这些东西存在文件服务器中,所以用的很少,我们知道有这个就可以了!
设计数据类型要考量:
1.使用最精确的类型,占用最少的空间。
(现在考虑的少了因为磁盘便宜了)
2 还应该考虑到相关语言处理方便性。
像我们用得是 Java 语言,要考虑使用在Java中有对应类的类型
3 考虑移值的兼容性。
我们现在用 MySQL 来存储数据,万一要把数据移到 oracle 数据库呢!
上次留言说想知道 decimal 的伙伴
现在知道了吗?
今天就到这儿了
领取专属 10元无门槛券
私享最新 技术干货