当前位置: 首页 > article >正文

MySQL数据库(4)—— 数据类型

目录

一,数据类型分类

二,数值类型

2.1 tinyint类型

2.2 bit类型

2.3 float类型

2.4 decimal类型

三,字符串类型

3.1 char类型

3.2 varchar类型

四,时间日期类型

五,enum和set类型

5.1 基本使用

 5.2 解释查找


一,数据类型分类

类型分类类型说明
数值类型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]占用4字节,M指定显示长度,D指定小数位数
DOUBLE[(M,D)] [UNSIGNED]占用8字节,M指定显示长度,D指定小数位数
DECIMAL(M,D) [UNSIGNED]M指定显示长度,D指定小数位数,每4个字节表示9个数字,小数点占用1字节
字符串类型ENUM枚举类型:ENUM类型的取值范围需要在定义字段时进行指定,设置字段值时只允许从成员中选取单个值,其所需的存储空间由定义ENUM类型时指定的成员个数决定
SET集合类型:SET类型的取值范围需要在定义字段时进行指定,设置字段值时可以从成员中选取一个或多个值,其所需的存储空间由定义SET类型时指定的成员个数决定
时间日期类型DATE / DATETIME日期类型:YYYY-MM-DD格式 / YYYY-MM-DD HH:MM:SS格式
TIMESTAMP时间戳:以YYYY-MM-DD HH:MM:SS格式进行显示
文本,二进制类型CHAR(L)固定长度字符串:L指定字符串长度,最大为255
VARCHAR(L)可变长度字符串:L指定字符串长度上限,最多占用65535字节
BLOB用于存储二进制数据
TEXT用于存储大文本数据
  • 注意:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)代表只有一个二进制位,也就是只有1和0两种取值,可以分别对应bool类型的true和false。 (搞一个bool可能是为了完善理论)

二,数值类型

2.1 tinyint类型

①有符号tinyint

  • tinyint占用1字节,是8各比特位,所以能表示的范围是 -128~127
  • 如果插入的值超过这个范围就会报错

②无符号tinyint

  •  范围是0~255,其余规则和有符号tinyint一样
  • 除非场景必须要求要是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型可能同样存不下,这时应该将数值类型进行提升

2.2 bit类型

 我们先建一个表:

由于我们把bit的位数设置成1,表示只有一个比特位,所以只能插入0或1:

然后就是查询:

上面第一次查询时显示的online不是0或1,因为bit类型在显示时,是按照ASCII码对应的值进行显示的,如果我们插入的是65,那么显示的就是A ,如下:

2.3 float类型

①有符号float

float[(m,d)] [unsigned]; m表示指定长度,d表示小数位数,
  • 比如我们定义float(4,2),那么就是代表4位数,范围是-99.99 ~ 99.99
  • 并且float还有四舍五入机制,比如我们插入23.456,那么最后存的就是23.46

②无符号float

  •  无符号就是去掉了负数,比如还是float(4,2) ,但是表示的范围只有0 ~ 99.99 了 

2.4 decimal类型

  • decimal类型的使用方式和float是一样的,但是decimal的精度更高

三,字符串类型

3.1 char类型

char(L) L最大为255
  • 假设是char(6),那么只要插入的字符个数不超过6个都能成功插入,如果超过6个就会报错
  • 这里说的字符不是单指一个字母,一个汉字也是一个祝福,所以也可以插入6个汉字 

  • 在不同编码中,一个字符所占字节个数是不同的,比如utf8中一个字符占3字节,gbk占2字节
  • 这样MySQL中字符就不用字节来描述了,这样用户就不用关心复杂的编码细节了,能让用户使用更便捷 

3.2 varchar类型

varchar类型的使用和char是一样的,但是二者有一些区别:

  • char类型可存储的字符上限位255,varchar类型可存储的字符上限与表的编码格式有关
  • char(L)定义后,不论字符串的长度是否达到L,都会开辟用于存储L个字符长度的定长空间,所以称为定长字符串类型
  • 而varchar类型会根据字符串长度按需开辟空间,比如varchar(6)定义后,假设只存了两个字符,那么就只会开辟两个字符的空间,另外开辟1-3字节的空间用于表示存储字符串长度以及其它控制信息

varchar类型最多占用65535字节,其中1~2字节用来表示实际数据长度,还有1字节用来存储其它控制信息,所以varchar类型的有效字节数最多是65532字节

而varchar类型可指定的字符个数上限与表的编码格式有关:

  •  对于utf8编码来说:一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 3 = 21844

  • 对于gbk编码来说:一个字符占两个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 2 = 32766

char和varchar的优缺点:

  • char类型的数据是定长的,因此有一定的空间浪费,但是因为是定长的,所以访问效率较高
  • varchar类型可以节省空间,但是由于要先读取部分信息然后再去读取数据,所以效率较低

如果数据是定长的比如手机号码、身份证号等定长数据就可以用char存;如果数据是变长的比如名字、 居住地址等就可以用varchar

四,时间日期类型

常用的三种时间日期类型如下:

  • date:日期格式为YYYY-MM-DD,占三字节,允许为空
  • datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占八字节,允许为空
  • timestamp:为时间戳,格式为YYYY-MM-DD HH:MM:SS,占四字节;不允许为空,如果我们不插入该列数据,那么会自动填充当前的时间戳

 

 使用timestamp创建评论表:

在插入评论人的昵称和评论的内容时,发布时间会默认设置成插入时间;并且如果修改了评论内容,对应的发布时间也会更新:

五,enum和set类型

5.1 基本使用

这两个类型的区别:

  • 在定义enum字段时需要提供若干个选项,在正式设置enum字段时只能选取其中的一个值。
  • 在定义set字段时需要提供若干个选项的值,在设置set字段值时可以选取其中的一个或多个值。

 比如人的性别只有两个,因此可以定义成enum类型;而人的身份可以有多个,所以可以定义成set类型

创建一个表,包含姓名,性别,身份,如下:

在插入数据时,性别就只能二选一,身份就可以多选,身份通过逗号隔开:

MySQL出于效率考虑,在存储enum和set的值时实际存储的是数字,规则如下:

enum数字规则:

  • enum中提供的选项值是持续递增的1、2、3、4持续递增,最多65535个
  • 所以可以在设置enum时可以通过数字进行设置

set数字规则:

  • set提供的选项值是1、2、4、8这样两倍递增的数字,最多64个
  • 上面我们输入的是4,所以直接找到了第三个位置的值也就是“ 团员 ”
  • 如果我们输入的是11,由于8的两倍是16,所以先找到8也就是第四个位置,然后用11减去8得到3,由于3比4小所以再次找到2,也就是第二个位置;最后3减去2剩下1,于是最后找到第一个位置,如下:

 5.2 解释查找

先再插入一条信息方便演示:

insert into t10 values('赵六','男','实习生');

如果要筛选出表中所有男同志的信息,只要在搜索时指明“ gender='男' ”即可,但是如果要搜索到身份是实习生的人的信息就不好搞了,如下:

可以看到它是非常死板的单一匹配,不具备模糊匹配的功能,所以我们需要借助一个函数

find_in_set(str, strlist)函数介绍:

该函数作用是查询strlist中是否包含str,如果包含则返回str在strlist中的位置,从1开始,否则返回0下面是对该函数的演示:

所以我们通过select搭配find_in_set函数就可以实现模糊筛选了:


http://www.kler.cn/a/554163.html

相关文章:

  • JavaScript系列(75)--代理模式专题
  • 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践
  • 六、线程间的协作原理场景剖析
  • 基于SpringBoot的“食物营养分析与推荐网站”的设计与实现(源码+数据库+文档+PPT)
  • vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点
  • Jenkins插件管理切换国内源地址
  • 前端开发岗模拟面试题套卷A答案及解析(一)技术面部分
  • LeetCode--236. 二叉树的最近公共祖先
  • NPM环境搭建指南
  • [笔记.AI]如何判断模型是否通过剪枝、量化、蒸馏生成?
  • 透明DNS策略
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑲】
  • vue 解决image-conversion图片处理插件压缩后图片底色变黑问题
  • 23种设计模式 - 访问者模式
  • < OS 有关 > Ubuntu 24 SSH 服务器更换端口 in jp/us VPSs
  • 【JavaEE进阶】Spring Boot日志
  • 爬虫抓取数据后如何存储?
  • 以下是MySQL中常见的增删改查语句
  • verilog程序设计及SystemVerilog验证
  • Linux 多进程生产者消费者模型实现