MySQL数据库之数据类型

小伙伴们

我们继续搞数据库

今天分享的是数据库的数据类型

首先来看一下图

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 的伙伴

现在知道了吗?

今天就到这儿了

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180513A0HTOE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券