Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql数据类型

MySQL数据类型详解

作者:景风~

本文详细给大家介绍了MySQL数据类型的相关知识,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

MySQL数据类型

数据类型的作用:

数据类型分类

分类数据类型说明
数值类型
 
BIT(M)位类型:M 指定位数,默认值为 1,范围为 1–64
BOOL布尔类型:使用 1 表示真,使用 0 表示假
TINYINT [UNSIGNED]占用 1 字节,默认为有符号
SMALLINT [UNSIGNED]占用 2 字节,默认为有符号
MEDIUMINT [UNSIGNED]占用 3 字节,默认为有符号
INT [UNSIGNED]占用 4 字节,默认为有符号
BIGINT [UNSIGNED]占用 8 字节,默认为有符号
FLOAT[(M,D)] [UNSIGNED]M 指定显示长度,D 指定小数位数,占用 4 字节
DOUBLE[(M,D)] [UNSIGNED]M 指定显示长度,D 指定小数位数,占用 8 字节
DECIMAL(M,D) [UNSIGNED]M 指定显示长度,D 指定小数位数;每 4 个字节表示 9 个数字,小数点占用 1 字节
文本、二进制类型
 
CHAR(L)固定长度字符串:L 指定字符串长度,最大为 255
VARCHAR(L)可变长度字符串:L 指定字符串长度上限,最多占用 65535 字节
BLOB用于存储二进制数据
TEXT用于存储大文本数据
时间日期DATE / DATETIME日期类型:YYYY-MM-DD 格式 / YYYY-MM-DD HH:MM:SS 格式
时间日期TIMESTAMP时间戳:以 YYYY-MM-DD HH:MM:SS 格式进行显示
字符串类型ENUM枚举类型:在定义字段时指定取值范围;只能从成员中选取单个值;存储空间由成员个数决定
字符串类型SET集合类型:在定义字段时指定取值范围;可从成员中选取一个或多个值;存储空间由成员个数决定

注:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。

数值类型

tinyint类型

有符号tinyint范围测试

由于tinyint类型占用1字节,因此有符号tinyint的取值范围为-128~127,插入该范围内的数据时都能成功插入。如下:

如果插入的数据不在-128~127范围内,那么插入数据时就会产生报错。如下:

无符号tinyint范围测试

由于tinyint类型占用1字节,因此无符号tinyint的取值范围为0~255,插入该范围的数据时都能成功插入。如下:

如果插入的数据不在0~255范围内,那么插入数据时就会产生报错。如下:

建议:

bit类型

bit类型的显示方式

mysql 客户端默认开启了 --binary-as-hex
只要列是二进制类型(BIT / BINARY / VARBINARY / BLOB),客户端就用十六进制显示,以避免乱码。所以 BIT(8) 存了十进制 10,我们看到的就是 0x0A

bit类型的范围测试

创建一个表,表当中包含用户名name和用户性别gender,其中gender的类型可以指定为1位bit类型,因为性别只有男和女两种取值,使用1个比特位来表示用户的性别就可以节省空间。如下:

如果插入gender列的数据不是0或1,那么插入数据时就会产生报错。如下:

建议:

float类型

有符号float范围测试

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

此外,由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,如果插入的数据不在该范围内,那么插入数据时就会产生报错。如下:

有符号float范围测试

创建一个表,表当中包含一个float(4,2)类型的列,并指定其为无符号类型。

无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994。如下:

如果插入的数据不在0~99.994范围内,那么插入数据时就会产生报错。如下:

为什么这里和tinyint类型的无符号取值不一样?

整数类型(如 TINYINT)

👉 可以看到:总数相等,只是符号位的解释不同。MySQL 对整数采用定长存储(补码),有符号与无符号在存储层面占用 相同的 1 个字节,所以值的“个数”完全一致。

浮点类型(FLOAT/DOUBLE)

浮点数遵循 IEEE 754 标准,存储方式不同于整数:

换句话说:

👉 因为 IEEE 754 并没有定义“把符号位转换成额外的数值空间”,所以无符号浮点数的取值范围不是两倍,而只是去掉负数部分

decimal类型

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

创建decimal为(5,2)的表

mysql 8.0以后的版本float和decimal有什么区别

存储方式

FLOAT / DOUBLE

DECIMAL(p,s)

精度和范围

注:MySQL8.0以后的版本使用float警告信息更严格

字符串类型

char类型

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

由于char(2)中最多可存储2个字符,因此只要插入的字符个数不超过2个都是能够成功插入的。如下:

说明: char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255

好处:

varchar类型

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

创建一个表,由于varchar(6)中最多可存储6个字符,因此只要插入的字符个数不超过6都是能够成功插入的。如下:

如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。如下:

varchar类型可指定的字符个数上限

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

因此在定义编码格式为utf8的表时,varchar(L)中的L如果超过了21844,则会产生报错。如下:

char和varchar比较

实际存储char(4)varchar(4)char 占用字节varchar 占用字节
abcdabcdabcd4*3=124*3+1=13
AAA4*3=121*3+1=4
Abcde数据超过长度数据超过长度

char和varchar的区别如下:

如何选取char和varchar类型?

char和varchar的优缺点如下:

如果要存储的数据是定长的,那就使用char类型进行存储,比如身份证号码、手机号、md5等。如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。

日期和时间类型

常用的日期有如下三个:

创建一个表,表当中包含date、datetime和timestamp三种时间日期类型的列。

查看表结构可以看到,timestamp类型的t3列是不允许为空的,它的默认值为CURRENT_TIMESTAMP

但明显这里的值不是CURRENT_TIMESTAMP,而是NULL;

这是因为MySQL 8.0 不会再自动给 TIMESTAMP 列加上 NOT NULL DEFAULT CURRENT_TIMESTAMP,现在需要 你自己明确指定。如下图:

插入数据后t3就会自动显示当前的时间戳

更新数据:

enum和set类型

enum和set类型的区别如下:

比如人的性别只能从男和女中进行二选一,因此可以定义成enum类型,而人的爱好在提供的选项中可能存在多个,因此可以定义成set类型。

调查表案例

有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选), (男,女)[单选]

向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开。

通过数字设置enum

在插入记录时,除了通过指明男女来设置性别,还可以通过插入数字1和2来设置性别。

如下:

根本原因在于,MySQL出于效率考虑,在存储enum值时实际存储的都是数字,enum中提供的选项值依次对应数字1、2、3、…,最多65535个,因此在设置enum值时可以通过数字的方式进行设置。

通过数字设置set

在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置。如下:

set数字设置的规则:

建议:

enum和set查找

如果想要筛选出调查表中所有男同志的信息,那么直接在筛选时指明gender='男'即可,因为enum类型的值只能多选一。如下:

但如果要筛选出调查表中爱好包含登山的人的信息就比较麻烦了,如果继续使用上述方式,那么最终筛选出来的是爱好仅为登山的人的信息。如下:

这时需要借助find_in_set(str,strlist)函数,该函数的作用是查询strlist中是否包含str,如果包含则返回str在strlist中的位置(从1开始),否则返回0。

通过select可以对find_in_set函数进行验证,依次查找集合a,b,c中是否包含字符a、b、d,这时在查找字符a和b时就会得到其在集合中的下标,而在查找字符d时就会得到0值。如下:

这时就可以通过select搭配find_in_set函数,来筛选出爱好包含登山的人的信息了。如下:

到此这篇关于MySQL数据类型的文章就介绍到这了,更多相关mysql数据类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文