【半夜学习MySQL】数据库中的数据类型(含数值类型、文本二进制类型、时间类型、String类型详谈)

在这里插入图片描述

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。
🎯每天努力一点点,技术变化看得见

文章目录

  • 数据类型分类
  • 数值类型
    • bit类型
    • tinyint类型
    • int类型
    • float类型
    • decimal类型
  • 文本、二进制类型
    • char类型
    • varchar类型
  • 时间类型
  • String类型
    • enum类型
    • set类型


数据类型分类

在这里插入图片描述

数值类型

在这里插入图片描述
对于上述类型中,本文仅挑选具有代表性的类型进行演示讲述,余下类型与演示类型具有相似性

bit类型

基本语法:

bit[(M)]

★ps:该类型为位字段类型,M表示比特位数,范围为1到64。如果M被省略,默认为1

举例:
例子1:

create table TestBit(id int,b bit(8));
insert into TestBit values (1001, 65);
insert into TestBit values (1002, 66);
insert into TestBit values (1002, 67);

在这里插入图片描述
★ps:从上面结果可以发现:bit字段在显示时,是按照ASCII码对应得值进行显示的。

例子2:

create table TestBit_a(id int,b bit);
insert into TestBit_a values (1001, 1);
insert into TestBit_a values (1002, 0);
insert into TestBit_a values (1002, 1);

在这里插入图片描述
★ps:由于bit字段在显示时,是按照ASCII码对应得值进行显示的。而ASCII码为0和1的字符不可显,故上述select语句执行后,结果中并没有显示任何字符。

测试:
TestBit_a表的b字段只占一个比特位,因而b的取值只能为0或1↓↓↓
在这里插入图片描述
如果插入非0或1的值呢?如下图所示,插入2、-1后,mysql直接拒绝了用户的操作↓↓↓
在这里插入图片描述
★ps:如果我们向mysql特定的类型中插入不合法的数据,mysql一般都是直接拦截我们,不让我们做对应的操作。反过来,如果我们已经有数据被成功插入到mysql中了,一定插入的时候是合法的。

★ps:所以。mysql中,一般而言,数据类型本身也是一种:约束(倒逼程序员,让程序员尽可能正确的插入,约束使用者;另外,如果你不是一个很好的使用者,mysql也能保证数据插入的合法性)。就能保证数据库中数据是可预期、完整的。

使用的注意事项:
● 在没有显示给出bit的位数时,默认为1↓↓↓
在这里插入图片描述
●如果某个字段只存在两种取值,则可以使用0表示第一种取值,1表示另一种取值。从而可以使用bit(1)存储,可节省空间。例如:下表中的性别使用1个bit表示↓↓↓
在这里插入图片描述

tinyint类型

基本语法:

tinyint [unsigned]

举例:
有符号tinyint示例:

create table TestTinyint(num tinyint);
insert into TestTinyint values (127);
insert into TestTinyint values (-128);
insert into TestTinyint values (0);
select * from TestTinyint;

在这里插入图片描述
无符号tinyint示例:

create table TestTinyint_un(num tinyint unsigned);
insert into TestTinyint_un values (0);
insert into TestTinyint_un values (255);
insert into TestTinyint_un values (123);
select * from TestTinyint_un;

在这里插入图片描述

测试:
这里演示了有符号与无符号tinyint的取值边界,及越界后,mysql会拒绝插入
对有符号tinyint的测试:

insert into TestTinyint values (128);
insert into TestTinyint values (-129);

在这里插入图片描述
对无符号tinyint的测试:

insert into TestTinyint_un values (-1);
insert into TestTinyint_un values (256);

在这里插入图片描述

使用的注意事项:
尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。

★ps:在MySQL中,整型可以指定为有符号和无符号两种,默认是有符号的。可以通过在字段类型最后添加UNSIGNED来说明某个字段是无符号的。

int类型

基本语法:

int(M) zerofill

举例:
示例1:

create table TestInt(num int);
insert into TestInt values(-2147483648);
insert into TestInt values(2147483647);
insert into TestInt values(0);

在这里插入图片描述
示例2:
如果希望某个字段取值最多有3位数,少于3位数的,需要给该数添加前导0↓↓↓

create table TestInt_a(num int(3) zerofill);
insert into TestInt_a values(1);
insert into TestInt_a values(22);
insert into TestInt_a values(333);
select * from TestInt_a;

在这里插入图片描述

★ps:int类型后面的数字主要是为了显示目的,并不影响存储或值的范围。在实际应用中,除非有特殊的显示需求,否则通常可以忽略这个显示宽度。

测试:
这里演示了有符号与无符号tinyint的取值边界,及越界后,mysql会拒绝插入

insert into TestInt values(2147483648);
insert into TestInt values(-2147483649);

在这里插入图片描述

float类型

基本语法:

float[(m,d)] [unsigned]

★ps:m指定显示长度,d指定小数位数,float占用4字节空间。即整数部分的位数=m-d。

举例:
示例1:
设计一个表,该表的num字段可以存储-99.99到99.99的数值

create table TestFloat(num float(4,2));
insert into TestFloat values(99.99);
insert into TestFloat values(-99.99);
insert into TestFloat values(3.7);
insert into TestFloat values(0.1);
insert into TestFloat values(8);

在这里插入图片描述
★ps:只要在当前字段范围内的数值,若该数值的小数位数不满d位,mysql会在最后自动补0

同时,float类型会自动进行四舍五入(由于99.999四舍五入后会变为100.00,超出float(4,2)表示范围,会报错)↓↓↓

insert into TestFloat values(9.957);
insert into TestFloat values(28.999);
insert into TestFloat values(99.999);

在这里插入图片描述
示例2:
如果num字段要求0到99.99,则此时可以使用unsigned进行修饰↓↓↓

create table TestFloat_un(num float(4,2) unsigned);
insert into TestFloat_un values(99.99);
insert into TestFloat_un values(0);
insert into TestFloat_un values(8.846);
insert into TestFloat_un values(9.732);

在这里插入图片描述

测试:
这里演示了有符号与无符号float的取值边界,及越界后,mysql会拒绝插入

insert into TestFloat values(-100.00);
insert into TestFloat values(100.00);
insert into TestFloat values(-99.9999);
insert into TestFloat values(99.9999);

在这里插入图片描述

insert into TestFloat_un values(-1);
insert into TestFloat_un values(100.00);
insert into TestFloat_un values(99.9999);

在这里插入图片描述
使用的注意事项:

create table TestFloat_b(num float);
insert into TestFloat_b values(123456789.123456789);
select * from TestFloat_b;

在这里插入图片描述
★ps:从上述结果可以看出,新插入的数值精度丢失。由于mysql中float占4字节(32个比特位),1个比特位表示符号位,23个比特位表示数值部分,8比特表示科学计数法的指数部分(而指数部分中1位标识指数的正负)。即数值部分表示的数值为0到2^23(8388608),而上述123456789.123456789的数值部分为123456789123456789,超出float数值部分表示返回,故发生了精度丢失。

decimal类型

基本语法:

decimal[(m,d)] [unsigned]

★ps:m指定长度,d表示小数点的位数

举例:

create table TestDecimal(num decimal(4,2));
insert into TestDecimal values(99.99);
insert into TestDecimal values(-99.99);
insert into TestDecimal values(8.979);
insert into TestDecimal values(9.432);

在这里插入图片描述
★ps:decimal相比float、double具有更高的精度,用法与float类似,如果希望小数的精度高,推荐使用decimal。

文本、二进制类型

char类型

基本语法:

char(L)

★ps:char类型为固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
举例:

create table TestChar(ch char(6));
insert into TestChar values('aa');
insert into TestChar values('bbbb');
insert into TestChar values('cccccc');
select * from TestChar;

在这里插入图片描述
★ps:char(L)中的L表明的是字符的个数,即使是中文字符也算一个字符,char并不考虑字符占据的字节数。不同编码下,各个字符占据的空间可能是不同的,例如:英文字符utf8编码需要1个字节存储,中文字符在utf8编码需要3个字节存储。

insert into TestChar values('小明六六六六');
select * from TestChar;

在这里插入图片描述

测试:
如果插入字符个数超出字段char(L)中的L长度,则会报错↓↓↓

insert into TestChar values('abcabcabc');

在这里插入图片描述
同时,char最长字符为255个,定义表时,如果超出255,将不被允许创建↓↓↓

create table TestChar_a(ch char(256));

在这里插入图片描述

varchar类型

基本语法:

varchar(L)

★ps:可变长度字符串,L表示字符长度,最大长度65535个字节

举例:

create table stu(id int, name varchar(6));
insert into stu values(1001, '小明');
insert into stu values(1002, '小唐');
insert into stu values(1003, '小张');
select * from stu;

在这里插入图片描述

测试:
如果插入超出varchar(L)指定的长度L,则会报错↓↓↓

insert into stu values(1004,'这是一个很长的名字');

在这里插入图片描述

注意事项:
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关↓↓↓
varchar长度可以指定为0到65535之间的值,但是有1到3个字节用于记录数据大小,所以说有效字节数是65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

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

下面对比一下char和varchar存储同一个数据的差异↓↓↓

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

上述4*3+1的+1操作,这1个字节用于存储字符串长度。这个数值的具体取值根据字符串长度的边长而增大,占用空间范围为1到3字节。

★ps:数据库中,每行数据的长度也有上限。如果只有一个类型为varchar的字段,则varchar可以取最大值21844(但一旦大于21844,mysql将不允许创建表);如果表中不仅包含类型为varchar的字段,还包含其他字段,则varchar的最大取值需要先减去其他字段所占用的空间。
在这里插入图片描述

时间类型

常用的日期类型有3中,分别如下:
date:日期yyyy-mm-dd,占用三个字节
datetime:时间日期yyyy-mm-dd hh:mm:ss,占用八个字节
timestamp:时间戳,从1970年开始经过的秒数,表示格式与datetime一致yyyy-mm-dd hh:mm:ss,占用四个字节
举例:

create table TimeTable(dat date, dt datetime, ttp timestamp, command varchar(128));
insert into TimeTable(command) values ('666');
insert into TimeTable values ('2024-8-8', '2024-8-8 12:23:23', '2024-8-8 12:23:23', 'nice bro!');

在这里插入图片描述
★对于类型为timestamp字段,在没有显式插入数值时,会被设置为当前时间。

如果对某行数据做更新,timestamp也会自动更新为当前时间↓↓↓
在这里插入图片描述

String类型

enum类型

基本语法:

enum(可选选项1,可选选项2,可选选项3,...)

enum提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值,即enum只支持单选。可设置的选项最多65535个。

举例:

create table vip(id int, name varchar(6), gender enum('男', '女'), grade enum('普通', '会员'));
insert into vip values(1001, '小明', '男', '会员');
insert into vip values(1002, '小翔', '男', '普通');
insert into vip values(1003, '小汤', '男', '会员');
select * from vip;

在这里插入图片描述

测试:
如果给类型为enum的字段插入非列举的值,则会报错↓↓↓

insert into vip(1004, '小雅', '女', '程序员');
insert into vip(1005, '小光', '保密', '会员');

在这里插入图片描述

注意事项:
enum为了提高存储效率,实际存储的是数字,上述vip表中的gender字段,1表示’男’,2表示’女’。因而我们要插入一个男生的信息,可以这么插入↓↓↓

insert into vip values(1004, '小光', 1, '会员');
select * from vip;

在这里插入图片描述
★ps:单选选项对应的数字是从1开始编号的,而不是从0开始编号的。

set类型

基本语法:

set(可选选项1,可选选项2,可选选项3,...)

★ps:该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值。最多可以设置64个选项。
举例:

create table hobby(name varchar(6), hobby set('编程', '羽毛球', '马拉松'));
insert into hobby values('小明', '编程');
insert into hobby values('小光','编程,羽毛球');
insert into hobby values('小翔','编程,羽毛球,马拉松');

在这里插入图片描述
★ps:set支持多选,如果多选的话,需要使用逗号间隔多个选项。

如果要选择爱好中包含’编程’的行呢?

select * from hobby where hobby='编程';

在这里插入图片描述
使用上述方式进行查找时,只会找到hobby只包含’编程’的。如果想找到爱好包含编程的,需要使用如下语句↓↓↓

select * from hobby where find_in_set('编程', hobby);

在这里插入图片描述
★ps:find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list是用逗号分隔的字符串。

测试:
如果插入不在set选项中的值,则会报错↓↓↓

insert into hobby values('小天', '蹦迪');

在这里插入图片描述

注意事项:
set使用位图的方式存储各个选项,第一个选项对应1( 2 0 2^0 20次方),第二个选项对应2( 2 1 2^1 21),第三个选项对应4( 2 2 2^2 22)…这样存储可以大大提高存储效率

例如上述的三个爱好中,'编程’对应最低1个比特位,即数字1;‘羽毛球’对应倒数第二个比特位,即数字2;‘马拉松’对应倒数第三个比特位,即数字4。如果同时选择’编程’和’马拉松’,则使用数字5表示。
在这里插入图片描述
下面示例,插入一个爱好为’编程’+'马拉松’的数据行↓↓↓

insert into hobby values('小刚', 5);
select * from hobby;

在这里插入图片描述
★ps:不建议在enum中使用选项对应的枚举值,集合值的时候采用数字的方式,因为不利于阅读。

🎈欢迎进入半夜学习MySQL专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.1. 离散时间鞅-条件期望

1.1. 离散时间鞅-条件期望 条件期望1. 条件期望的定义1.1. 条件期望的定义1.2. 条件期望的存在唯一性 2. 条件期望的示例2.1. X ∈ F X \in \mathcal{F} X∈F, X X X与 F \mathcal{F} F独立的情形2.2. X X X是有限 σ \sigma σ代数情形2.3. X X X是随机变量生成…

[Flutter GetX使用] Getx路由和状态管理-GetController使用过程中的踩坑记录

文章目录 问题 - Get.find() 报错!原因总结A:路由和控制器设计a1:项目中的Get路由aa1.项目路由结构aa2.本项目路由的注意点: B: GetController的冷知识C: 总结来看D: 一些参考资料 问题 - Get.find() 报错! 刚接触Getx, 遇到 Get.find()确找不到, 进而报错的问题, 一时间有点没…

智慧旅游平台开发微信小程序【附源码、文档说明】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

关于DDD和COLA的一些总结和思考

1|0思维:面向对象和面向过程 领域驱动设计本质上是讲的面向对象,但是谈面向对象,始终无法绕开面向过程,所以我们先好好说一下面向过程和面向对象这两个概念。 什么是面向过程呢,其实就是我们学习编程时最初被植入的逻辑…

【安全每日一讲】加强数据安全保护 共享数字化时代便利

前言 数据安全是数据治理的核心内容之一,随着数据治理的深入,我不断的碰到数据安全中的金发姑娘问题(指安全和效率的平衡)。 DAMA说,降低风险和促进业务增长是数据安全活动的主要驱动因素,数据安全是一种资…

sbt安装

一、sbt介绍 在Spark中,sbt(Scala Build Tool)是一个用于构建Scala项目的工具。它是Spark项目的主要构建工具之一,用于编译Scala代码、管理依赖项、打包应用程序以及执行其他与项目构建相关的任务。 sbt的用途在Spark开发中主要…

基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯串口输出 引言: ​ 在现代电子设计领域,FPGA(现场可编程门阵列)因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II,作为Altera(现为Intel旗下)提供…

VMware虚拟机故障:“显示指定的文件不是虚拟磁盘“,处理办法

一、故障现象 由于虚拟机宕机,强制重新启动虚拟机后显示错误,没有办法启动虚拟机。 虚拟机有快照,执行快照还原,结果也不行,反复操作,在虚拟机文件目录出现很多莫名文件 二、故障原因 根据故障提示&#…

数据结构(C):玩转链表

目录 🍺0.前言 1.链表的概念 2.链表的分类 2.1带头不带头 2.2单向和双向 2.3循环和不循环 2.4主要使用的链表 3.链表的实现 3.1申请一个链表 3.2头插和尾插 3.2.1函数的形参问题 3.2.2二级指针问题解决 3.3头删和尾删 3.4打印链表 3.5查找 3.5销…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同: 1)、web、openfeign 2)、每一个服务,包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3)、模块名&#x…

​《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制德国每日风能和太阳能产量3D线图

在MATLAB中,要绘制3D线图,可以使用 plot3 函数。 在《MATLAB科研绘图与学术图表绘制从入门到精通》书中通过绘制德国每日风能和太阳能产量3D线图解释了如何在MATLAB中绘制3D线图。 购书地址:https://item.jd.com/14102657.html

完美解决Windows10下-更换JDK环境变量后,在cmd下执行仍java -version然出现原来版本的JDK的问题

一、错误场景预演 本人欲将 JDK 1.8 通过安装包的方式升级为 JDK 22。 本地旧版本:1.8.0_221预升级版本:22.0.1 1.1、查看本地旧版本 在配置环境变量之前,首先我们要明确,本地存在旧版本,如果本地没有 Java&#x…

MFC通过继承现有控件自定义控件

在MFC 自定义控件,可以通过继承MFC提供的控件类(如CButton、CEdit、CListBox等)并重写其成员函数和消息处理函数来实现。 以下是一个基本的步骤指南,用于在MFC中创建自定义控件: 确定要继承的基类: 首先…

vm16安装最新版本的ubuntu虚拟机,并安装g++的步骤记录

背景 低版本的ubuntu安装G一直不成功,干脆安装最新版的 官网下载 bing搜索ubuntu 下载完成 vm16新建虚拟机 一直下一步,安装完成 终端输入命令 sudo apt-get update ᅟᅠ       sudo apt install gcc ᅟᅠ      sudo apt install g

树莓派点亮FPGA小灯

树莓派点亮FPGA小灯 引言: ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信,控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号,通过串口传输至FPGA,并在FPGA上实现逻辑解析,以点亮指定的小灯。…

【QT】QT背景介绍

本专栏内容为:QT学习专栏 通过本专栏的深入学习,你可以了解并掌握QT。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:QT 🚚代码仓库:小小unicorn的代码仓库🚚 🌹&#x1f…

3D分子生成的定制扩散框架 MolDiff - 评测

MolDiff模型是一种考虑分子键生成的3D分子生成的新模型。MolDiff是清华大学智能产业研究院马剑竹课题组发表在PMLR 2023的工作,第一作者是Xingang Peng,文章题目为:《 Addressing the Atom-Bond Inconsistency Problem in 3D Molecule Genera…

【Android】Kotlin学习之数据容器 -- 集合

一. 定义 List : 是一个有序列表, 可通过下标访问元素. 元素可以在list中出现多次, 元素可重复 Set : 是元素唯一的集合, 一般来说Set中元素的顺序并不重要, 无序集合. Map : 是一组键值对, 键是唯一的, 每个键刚好映射到一个值, 值可以重复 二. 集合创建 三. 示例 mutabl…

OSTE-Web-Log-Analyzer:基于Python的Web服务器日志自动化分析工具

关于OSTE-Web-Log-Analyzer OSTE-Web-Log-Analyzer是一款功能强大的Web服务器日志自动化分析工具,该工具专为安全研究人员设计,能够使用Python Web日志分析工具(Python Web Log Analyzer)帮助广大研究人员以自动化的形式实现Web服…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变,取决于变换的类型。使用逆转置矩阵,可以安全地解决该问题,而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量,因为平移不会改变物体的方向。 旋转变换会改…