MySQL数据类型

文章目录

  • 一、数据类型分类
  • 二、数值类型
    • 1. tinyint 类型
    • 2. bit 类型
    • 3. int 类型
    • 4. float 类型
    • 5. decimal 类型
  • 三、字符串类型
    • 1. char 类型
    • 2. varchar 类型
    • 3. char 和 varchar 比较
    • 4.日期和时间类型
    • 5. enum 和 set

一、数据类型分类

MySQL数据类型_第1张图片

数据类型本质也是一种约束!
如果插入的数据不满足约束条件,直接终止!

换个角度,就意味着如果满足约束条件,就允许插入。
再换个角度,就意味着给表中的数据提供了极大的确定性。

二、数值类型

如果插入的数据越界了,SQL 会直接终止!这就是数据类型约束了 SQL 的执行

换言之,能插入的数据一定是范围之内的数据。

1. tinyint 类型

tinyint [unsigned]:带符号范围[-128, 127],无符号范围[0, 255]。默认有符号

MySQL数据类型_第2张图片

tinyint unsigned 类型:

MySQL数据类型_第3张图片

2. bit 类型

bit[(m)]:位类型,m指定位数,范围[1,64]。若m被忽略,默认为1

bit 字段在显示时,是按照 ASCII 码对应的值显示的。

MySQL数据类型_第4张图片10 是控制字符。

65 对应字符 ‘A’ 。MySQL数据类型_第5张图片

如果我们有这样的值,只存放 0 或 1,这时可以定义 bit(1) 。因为这样可以节省空间。

MySQL数据类型_第6张图片1 和 0 都是控制字符。

3. int 类型

int [unsigned]:带符号范围[-2^31, 2^31-1],无符号范围[0, 2^32-1]。默认有符号

MySQL数据类型_第7张图片
MySQL数据类型_第8张图片

4. float 类型

float[(m, d)] [unsigned]:m指定显示长度,d指定小数位数

float(4,2) 表示的范围是 [-99.99, 99.99],MySQL 在保存 float 值时会进行四舍五入。MySQL数据类型_第9张图片MySQL数据类型_第10张图片MySQL数据类型_第11张图片

float unsigned 类型:

float(4,2) unsigned 表示的范围是 [0, 99.99],负数直接不让插入。MySQL数据类型_第12张图片

5. decimal 类型

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

decimal(4,2) 表示的范围是 [-99.99, 99.99],MySQL 在保存 decimal 值时会进行四舍五入。MySQL数据类型_第13张图片

decimal unsigned 类型:

decimal(4,2) unsigned 表示的范围是 [0, 99.99],负数直接不让插入。MySQL数据类型_第14张图片

decimal 和 float 很像,但是有区别:两者表示的精度不一样,decimal 表示的精度更高

MySQL数据类型_第15张图片

如果希望小数的精度高,推荐使用 decimal 。

三、字符串类型

1. char 类型

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

char(2) 表示可以存放两个字符(可以是字母或汉字),但是不能超过 2 个。

注:
 ① 在概念上,字符 != 字节。
 ② 在不同的编码格式中,汉字字符所占的字节数不一定相等。MySQL数据类型_第16张图片
在这里插入图片描述

2. varchar 类型

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

MySQL数据类型_第17张图片

说明:关于 varchar(L),L 到底是多大,跟表的编码格式密切相关。
 ① varchar 的长度(字节)可以指定为 [0, 65535] 之间的值,但是有 1 - 3 个字节用于记录数据大小,所以有效字节数是 65532 。
 ② 当表的编码是 utf8 时,varchar(L) 的参数 L 最大值是 65532/3=21844(因为在 utf8 中,一个字符占用 3 个字节)。如果编码是 gbk,varchar(L) 的参数 L 最大值是 65532/2=32766(因为在 gbk 中,一个字符占用 2 个字节)。

MySQL数据类型_第18张图片注:这里采用的默认字符集是 utf8 。

3. char 和 varchar 比较

实际存储 char(4) varchar(4) char占用字节 varchar占用字节
呵呵哈哈 呵呵哈哈 呵呵哈哈 4*3=12 4*3+1=13
4*3=12 1*3+1=4
嘻嘻嘻嘻嘻 × × 数据超过长度 数据超过长度

如何选择定长或变长字符串?

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证、手机号、md5 。
  • 如果数据长度有变化,就使用变长(varchar),但是要保证最长的能存得进去,比如:名字、地址。
  • 定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低。
  • 定长的意义是,直接开辟好对应的空间。
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

4.日期和时间类型

常用的有如下三个:

date:日期,格式为 'yyyy-mm-dd',占用三字节
datetime:时间日期,格式为 'yyyy-mm-dd HH:ii:ss',占用八字节
timestamp:时间戳,格式为 'yyyy-mm-dd HH:ii:ss',占用四字节

若插入数据时不插入 timestamp 列,则会自动补上当前的时间戳。

MySQL数据类型_第19张图片

更新数据,时间戳会自动更新成当前的时间戳。

MySQL数据类型_第20张图片

5. enum 和 set

enum:枚举,“单选”类型
enum('选项值1', '选项值2', '选项值3', ...)

说明:
 ① 该设定只是提供了若干个选项的值,只允许多选一。
 ② 最终一个单元格中,实际只存储了其中一个值,而且出于效率考虑,实际存储的是数字(这些选项的每个选项值依次对应数字 1, 2, 3, …,最多 65535 个)。因此,当我们插入枚举值时,除了可以通过选项值来设置之外,还可以通过数字来设置。

set:集合,“多选”类型
set('选项值1', '选项值2', '选项值3', ...)

说明:
 ① 该设定只是提供了若干个选项的值,可允许多选多。
 ② 最终一个单元格中,实际存储了其中任意多个值,而且出于效率考虑,实际存储的是数字(这些选项的每个选项值依次对应数字 1, 2, 4, …,最多 64 个)。因此,当我们插入集合值时,除了可以通过选项值来设置之外,还可以通过数字来设置。
 ③ 集合中的每个选项值分别对应一个比特位。

若插入的数据超过枚举或集合的范围,则不进行插入,直接报错。

严重不建议在插入枚举值或集合值的时候采用数字的方式,因为不便于阅读!


enum:

MySQL数据类型_第21张图片

通过数字的方式进行插入或查询。MySQL数据类型_第22张图片
MySQL数据类型_第23张图片

set:

MySQL数据类型_第24张图片

通过数字的方式进行插入(集合中的每个选项值分别对应一个比特位)。MySQL数据类型_第25张图片
MySQL数据类型_第26张图片MySQL数据类型_第27张图片

如果对集合直接进行查询,只会严格匹配。
比如我们想查找爱好 “包含” 游泳的人的信息,但查询结果是爱好 “只有” 游泳的人的信息,这不符合我们的要求。

MySQL数据类型_第28张图片

对集合进行查询,可使用find_in_set函数。
比如我们想查找爱好 “包含” 游泳的人的信息,可使用该函数来进行查找。

MySQL数据类型_第29张图片

你可能感兴趣的:(MySQL,mysql,数据库,sql)