【MySQL】第十六部分 MySQL数据类型详解

【MySQL】第十六部分 MySQL数据类型详解



16. MySQL数据类型详解

16.1 整数类型

整数类型字节有符号数取值范围无符号数取值范围
TINYINT1-128~1270~255
SMALLINT2-32768~327670~65535
MEDIUMINT3-8388608~83886070~16777215
INT,INTEGER4-2147483648~21474836470~4294967295
BIGINT8-9223372036854775808~92233720368547758070~18446744073709551615

上述类型使用的场景:

TINYINT:一般用于枚举数据,比如系统设定特定的身份。

SMALLINT:可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。

MEDIUMINT:用于较大整数的计算,比如车站每日的客流量等。

INT、INTEGER:取值范围足够大,一般情况下不用考虑超限问题,用得最多。

BIGINT:只有当你处理特别巨大的整数时才会用到。比如: 双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。

在实际的工作中,先确保数据不会超过取值范围,再去考虑如何节省空间,否则得不偿失.


16.2 浮点类型

浮点数定点数类型的特点是可以处理小数,可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOATDOUBLE

  • FLOAT 表示单精度浮点数;
  • DOUBLE 表示双精度浮点数;
    在这里插入图片描述

FLOAT DOUBLE 它们之间主要的区别是: FLOAT 占用字节数少,取值范围小DOUBLE 占用字节数多,取值范围也大.

浮点数类型精度会有误差:

CREATE TABLE test1(
	f1 DOUBLE
);

INSERT INTO test1
VALUES(0.47),(0.44),(0.19);

SELECT SUM(f1) 
FROM test1;

在这里插入图片描述


16.3 定点数类型

数据类型字节数含义
DECIMAL(M,D),DEC,NUMERICM+2字节有效范围由M和D决定 ( 0<=M<=65,0<=D<=30) M表示总位数,D表示小数点保留几位

例如: 定义DECIMAL(6,2)的类型,表示该取值范围是 -9999.999999.99

浮点数 vs 定点数

浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是精度会缺失,适用场景: 需要取值范围大,但是可以容许微小误差的业务场景.

定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景 比如涉及金额计算的场景.

ALTER TABLE test1 ADD f2 DECIMAL(6,2)

INSERT INTO test1(f2)
VALUES(0.47),(0.44),(0.19);

SELECT SUM(f2)
FROM test1;

在这里插入图片描述


16.4 位类型 BIT

BIT类型中存储的是二进制值,010101。

二进制字符串类型长度长度范围占用空间
BIT(M)M1 <= M <= 64约为(M + 7)/8个字节

BIT类型,如果没有指定(M),默认是1位,表示只能存1位的二进制值。在向BIT类型的字段中插入数据时,一定要确保插入的数据在BIT类型支持的范围内。

CREATE TABLE test1(
	f1 BIT(8),
	f2 BIT
)

INSERT INTO test1 
VALUES(12,0)

SELECT * FROM test1

16.5 日期和时间类型

  • YEAR类型通常用来表示
  • DATE类型通常用来表示年、月、日
  • TIME类型通常用来表示时、分、秒
  • DATETIME类型通常用来表示年、月、日、时、分、秒
  • TIMESTAMP类型通常用来表示带时区的年、月、日、时、分、秒
类型名称字节日期格式最小值最大值
YEAR1YYYY或YY19012155
TIME时间3HH:MM:SS-838:59:59838:59:59
DATE日期3YYYY-MM-DD1000-01-019999-12-03
DATETIME日期时间8YYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-31 23:59:59
TIMESTAMP日期时间4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 UTC2038-01-19 03:14:07UTC

TIMESTAMP和DATETIME的区别:

  1. TIMESTAMP存储空间比较小,表示的日期时间范围也比较小

  2. 底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-1 0:0:0 0毫秒的毫秒值。

  3. 两个日期比较大小或日期计算时,TIMESTAMP更方便、更快。

  4. TIMESTAMP和时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。

在工作中,用得最多的日期时间类型,就是 DATETIME

CREATE TABLE test_time(
	f1 YEAR,
	f2 DATE,
	f3 TIME,
	f4 DATETIME,
	f5 TIMESTAMP
)

INSERT INTO test_time
VALUES (CURRENT_DATE,CURRENT_DATE,CURRENT_TIME,NOW(),NOW())

SELECT * FROM test_time

在这里插入图片描述


16.6 文本字符串类型

文本字符串总体上分为CHARVARCHARTINYTEXTTEXTMEDIUMTEXTLONGTEXTENUMSET等类型。


16.6.1 CHAR VS VARCHAR类型

字符串(文本)类型特点长度长度范围占用的存储空间
CHAR(M)固定长度M0 <= M <= 255M个字节
VARCHAR(M)可变长度M0 <= M <= 65535(实际长度 + 1) 个字节

CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符,如果数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格, 定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。

VARCHAR(M)类型必须指定长度M,否则报错,MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;MySQL5.0版本以上,varchar(20):指的是20字符。

类型特点空间上时间上适用场景
CHAR(M)固定长度浪费存储空间效率高存储不大,速度要求高
VARCHAR(M)可变长度节省存储空间效率低存储大,速度要求不高

情况1:存储很短的信息。比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度。

情况2:固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

情况3:十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。


16.6.2 TEXT类型

文本字符串类型特点长度长度范围占用的存储空间
TINYTEXT小文本、可变长度L0 <= L <= 255L + 2 个字节
TEXT文本、可变长度L0 <= L <= 65535L + 2 个字节
MEDIUMTEXT中等文本、可变长度L0 <= L <= 16777215L + 3 个字节
LONGTEXT大文本、可变长度L0 <= L<= 4294967295(相当于4GB)L + 4 个字节

TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。TEXT和BLOB类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。


16.6.3 ENUM类型

ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值

文本字符串类型长度长度范围占用的存储空间
ENUML1 <= L <= 655351或2个字节
CREATE TABLE test_enum
(
	gender ENUM("男","女"),
	season ENUM("春","夏","秋","冬")
)

INSERT INTO test_enum
VALUES("男","秋")

# 当ENUM类型的字段没有声明为NOT NULL时,插入NULL也是有效的
INSERT INTO test_enum
VALUES(NULL,NULL);

# 允许按指定索引位置的枚举值
INSERT INTO test_enum
VALUES(1,2)

SELECT * FROM test_enum

在这里插入图片描述

16.6.4 SET类型

SET类型,SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64设置字段值时,可以取值范围内的 0 个或多个值

成员个数范围(L表示实际成员个数)占用的存储空间
1 <= L <= 81个字节
9 <= L <= 162个字节
17 <= L <= 243个字节
25 <= L <= 324个字节
33 <= L <= 648个字节
CREATE TABLE test_set(
s SET ('A', 'B', 'C')
);

INSERT INTO test_set (s) VALUES ('A'), ('A,B');

#插入重复的SET类型成员时,MySQL会自动删除重复的成员
INSERT INTO test_set (s) VALUES ('A,B,C,A');

#向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。
INSERT INTO test_set (s) VALUES ('A,B,C,D');

SELECT *
FROM test_set;

16.7 二进制字符串类型

MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB类型。


16.7.1 BINARY和VARBINARY

二进制字符串类型特点值的长度占用空间
BINARY(M)固定长度M (0 <= M <= 255)M个字节
VARBINARY(M)可变长度M(0 <= M <= 65535)M+1个字节

类似于CHAR和VARCHAR,区别只是它们存储的是二进制字符串

BINARY (M)为固定长度的二进制字符串M表示最多能存储的字节数,取值范围是0~255个字符。如果未指定(M),表示只能存储1个字节。例如BINARY (8),表示最多能存储8个字节,如果字段值不足(M)个字节,将在右边填充’\0’以补齐指定长度。

VARBINARY (M)为可变长度的二进制字符串M表示最多能存储的字节数,总字节数不能超过行的字节长度限制65535,另外还要考虑额外字节开销,VARBINARY类型的数据除了存储数据本身外,还需要1或2个字节来存储数据的字节数。VARBINARY类型必须指定(M),否则报错。


16.7.2 BLOB类型

BLOB是一个二进制大对象,可以容纳可变数量的数据。

二进制字符串类型值的长度长度范围占用空间
TINYBLOBL0 <= L <= 255L + 1 个字节
BLOBL0 <= L <= 65535(相当于64KB)L + 2 个字节
MEDIUMBLOBL0 <= L <= 16777215 (相当于16MB)L + 3 个字节
LONGBLOBL0 <= L <= 4294967295(相当于4GB)L + 4 个字节

需要注意的是,在实际工作中,往往不会在MySQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到服务器的磁盘上,并将图片、音频和视频的访问路径存储到MySQL中。


16.8 JSON 类型

JSON是一种轻量级的数据交换格式, JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。

CREATE TABLE test_json(
	js json
);

INSERT INTO test_json (js) 
VALUES ('{"name":"lilei", "age":18, "address":{"province":"shanghai", "city":"shanghai"}}');

综上

  1. 定义整数的时候,就用INT
  2. 定义浮点数的时候,就用DECIMAL(M,D)
  3. 定义时间和日期的时候,就用DATETIME
  4. 定义字符串的时候,根据实际的需求选择CHAR或者VARCHAR
  5. 定义字段为TEXT,独立出一张表,用主键来对应,避免影响其他字段索引的效率

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值