数据库的数据类型

文章目录

  • 前言
  • 一、数据类型
    • 数据类型分类
    • 数值类型
    • bit类型
    • 小数类型
      • float
      • decimal
    • 字符串类型
      • char
      • varchar
      • char和varchar比较
    • 日期和时间类型
    • enum和set


前言


一、数据类型

数据类型分类

在这里插入图片描述

数值类型

在这里插入图片描述
下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tinyint为无符号类型时,tinyint默认为有符号类型整数。在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的
在这里插入图片描述
下面我们向表中插入数据。我们看到当向表中插入tinyint范围内的数据时,可以成功插入。当插入的数据不在tinyint时,会直接插入失败。
在这里插入图片描述
下面我们创建一个表t2,该表中的tinyint类型为无符号整型。
在这里插入图片描述
下面我们向表中插入数据,我们看到当插入的数据超过tinyint的范围时,数据库是不允许插入数据的。
在这里插入图片描述
通过上面的例子,我们知道了当向数据库中插入不合法的数据时,MySQL会直接插入数据失败,通过这样对数据的约束,MySQL就保证了表中的数据都是合法的。上面我们只测试了tinyint类型,但是在MySQL中其它的数值类型,例如int,bigint等的特性和tinyint一致。

bit类型

bit类型为位类型。基本语法如下:

bit(M)  //M表示每个值的位数,范围为1-64,如果M忽略,那么默认为1。

下面我们创建一个表t3,并且让online设为bit(1)类型,那么这个online就只能存储1或0了。
在这里插入图片描述
我们看到如果插入的数据超过bit(1)类型的范围,那么就会插入数据失败。
在这里插入图片描述
我们看到显示数据时,online的数据并没有显示,这是因为bit字段在显示时,是按照ASCII码对应的值显示。
,而因为ASCII为1和0的这个字符不能显示,所以什么都看不到。
在这里插入图片描述
下面我们将online的数据为十进制显示,我们可以看到了。
在这里插入图片描述
下面我们验证bit类型存储的是字符的ASCII码值。我们先修改online的类型为bit(10),然后我们插入字符’a’和97,显示数据时都显示了字符’a’。因为字符’a’的ASCII码值为97。
在这里插入图片描述

小数类型

float

语法:
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节。
例如:小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
下面我们创建一个选项salary为float(4,2)类型的数据,表示该浮点类型的显示长度为4,小数位数为2。如果不显示定义unsigned,那么默认为有符号类型。

create table t1(id int, salary float(4,2));

在这里插入图片描述
然后我们向表中插入数据。可以看到当插入数据的精度不够两位时会自动补为两位。如果要求精度为两位,但是插入的数据精度为三位,那么会进行四舍五入。
在这里插入图片描述
下面我们创建一个新表,并且定义一个类型为unsigned的float(4,2)的浮点数。然后向表里面插入数据,我们看到只能插入0~99.99范围内的合法数据。
在这里插入图片描述

decimal

语法:
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数.
例如:decimal(5,2) 表示的范围是 -999.99 ~ 999.99。decimal(5,2) unsigned 表示的范围 0 ~ 999.99。
decimal和float很像,但是有区别:float和decimal表示的精度不一样。

下面我们创建一个表来进行标记decimal和float的区别。我们看到float存储小数位比较多时,当第7位就会出现精度丢失,而且当我们规定float存储小数点后8位时,而输入的数据不到8位时,float存储的数据只有前面的是准确的。而decimal类型存储的数据一直都是准确的。所以当我们想要存储的小数精度更准确时,可以选择使用decimal类型存储。并且float表示的精度大约是7位。而decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0。如果m被省略,默认是10。
在这里插入图片描述

字符串类型

char

语法:
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255。
下面我们创建一个表,其中name选项为char(2)类型。我们看到当插入的字符串长度超过定义的长度时,会插入数据失败。并且我们看到当插入两个汉字时会插入成功,而出现三个汉字时会插入失败。我们知道一个字符为1个字节,一个汉字在utf_8中为3个字节,那么两个汉字就为6字节了,为什么还能插入成功呢?这是因为MySQL中的char的单位为字符,而不是字节。如果这个表采用utf_8字符集的话,那么每个字符的大小就为3个字节,当定义char(2)时,就会直接开辟6字节的空间。
在这里插入图片描述
在这里插入图片描述
char字符串可以存储的最大长度为255。当我们有超过255的字符串时,就需要使用变长字符串varchar来存储了。
在这里插入图片描述

varchar

语法:
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节(注意单位为字节)。
下面我们创建一个新表,然后设置name选项为varchar(6)类型,则表示name选项只能存储6个字符。
在这里插入图片描述
下面我们来改变name选项的类型为varchar(65535)。我们发现提示说varchar的最大长度为21845。然后我们将varchar长度修改为21845后,还是更改失败。这就和varchar的len有关了。
在这里插入图片描述
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf8中,一个字符占用3个字节],而上面我们的测试中varchar为21844也出错了,这是因为MySQL中允许一行数据最大为65535字节,而我们的int占4个字节,所以需要再减去4字节。如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
下面我们来验证utf8字符集下varchar最大长度为21844,gbk字符集下varchar最大长度为32767。
在这里插入图片描述
在这里插入图片描述

char和varchar比较

我们可以看到当使用定长char时,不管字符串的长度够不够规定的,MySQL都会开出长度 * 字符大小的空间。而varchar可以根据字符串的长度来开空间。可以看到varchar的总占用字节会多出来1-3个字节,当字符串长度较小时,1个字节就可以存长度。当字符串长度较大时需要3个字节存长度。
在这里插入图片描述
如何选择定长或变长字符串?

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

日期和时间类型

常用的日期有如下三个:

  • date :日期 ‘yyyy-mm-dd’ ,占用三字节。
  • datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节。
  • timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。

下面我们创建一个包含这三个日期类型的表。
在这里插入图片描述
我们看到当我们插入数据时,并没有给t3值,但是t3自动存储了当前时间。并且当我们更新表中的内容时,timestamp类型的t3会自动更新时间。
在这里插入图片描述
在这里插入图片描述

enum和set

语法:

  • enum:枚举,“单选”类型;

  • enum(‘选项1’,‘选项2’,‘选项3’,…);
    该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

  • set:集合,“多选”类型;

  • set(‘选项值1’,‘选项值2’,‘选项值3’, …);
    该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。

下面我们创建一个含义enum类型和set类型的表。
在这里插入图片描述
当我们向表中插入数据时,我们看到gender选项可以填我们的枚举值,也可以填1或2,但是除此之外的其它值都不可以填写。其实我们填入的1,2就是enum类型枚举的选项的下标。
在这里插入图片描述
下面我们看到当对hobby选项插入数据时,因为hobby为set类型,所以可以插入多个列举的内容,以逗号为分割。但是不能插入set没有列举的内容。
在这里插入图片描述
set类型插入也可以使用数字,但是set类型使用数字插入时,数字并不是列举的内容的下标。而是位图。即如果是1,1的二进制为00001。如果是2,2的二进制为00010。如果是3,3的二进制为00011。如果是4,4的二进制为00100。所以这就对应了。
在这里插入图片描述
enum的查找我们可以使用枚举的字符,也可以使用下标。
在这里插入图片描述
我们看到set的查找可以使用字符串,也可以使用位图。但是我们发现set的查找是严格匹配的,即当我们查’代码’时,只会把hobby为’代码’的显示出来。而当我们想要查看hobby中包含’代码’的数据时,该怎样查看呢?
在这里插入图片描述
此时我们可以使用集合查询函数,find_ in_ set函数。
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。
例如下面的一个find_in_set函数的案例。
在这里插入图片描述
下面我们就可以使用find_in_set函数来插入表votes中hobby包含羽毛球的人了。
在这里插入图片描述
当我们想要查看hobby同时包含羽毛球和代码的人时,可以使用and连接两个find_in_set函数的结果。
在这里插入图片描述

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

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

相关文章

【贪心】重构字符串

/*** 思路:如果s长度小于2,直接返回s,假设字符串s的长度为n。* n为偶数,如果字符串中的某个字符数量超过 n/2 则肯定会存在相邻的字符。* n为奇数,如果字符串中的某个字符的数量超过 (n1&am…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了!距离截稿还有24天,想冲ICML的同学速度! ICML 全称 International Conference on Machine Learning,由国际机器学习学会(IMLS)举办,与NIPS一同被认为是人工智能、机器学…

debian 11 arm64 aarch64 D2000 平台编译 box86 box64 笔记

参考资料 https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md 源码地址 GitHub - ptitSeb/box86: Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices deb在线源地址(打不开): Itais box86…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

一文解析低代码平台

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台,通过可视化进行应用程序开发的方法,让不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发,实现了四个标准的隔离级别,默认为可重复读,并且通过间隙锁(next-key locking)策略防止幻读(查询的行中的间隙也会锁定…

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战12(好友关注、Feed流(关注推送)、滚动分页查…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sp…

大语言模型向量数据库

大语言模型&向量数据库 LARGE LANGUAGE MODELSA. Vector Database & LLM WorkflowB. Vector Database for LLMC. Potential Applications for Vector Database on LLMD. Potential Applications for LLM on Vector DatabaseE. Retrieval-Based LLMF. Synergized Exampl…

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

Leetcode202快乐数(java实现)

今天分享的题目是快乐数&#xff1a; 快乐数的定义如下&#xff1a; 快乐数&#xff08;Happy Number&#xff09;是指一个正整数&#xff0c;将其替换为各个位上数字的平方和&#xff0c;重复这个过程直到最后得到的结果为1&#xff0c;或者无限循环但不包含1。如果最终结果为…

使用ElementUI的el-tab+vxe-table表格+复选框选择

效果&#xff1a; 功能&#xff1a;首先进来是全部清空的状态的 点击左边选择不同项右边会实时发送接口获取数据填充表格 复选的内容可以保留显示&#xff0c;比如A的1勾选后切换到B再切换回来A的1仍然是勾选状态 说实话官网的setCheckboxRow方法我实现不了&#xff0c;这里…

2024年华夏银行总行社会招聘公告

信息科技部自动化测试与开发类岗  工作地点&#xff1a;北京市 学历要求&#xff1a;本科及以上 工作职责 1、持续推进自动化测试的开展&#xff0c;提升自动化测试覆盖率,包括方案设计、测试分析、测试执行和总结等。 2、负责自动化测试工具和框架搭建&#xff0c;根据…

CSAPP阅读笔记-信息的表示和处理

信息的表示和处理 包括整数、浮点数的存储格式、计算中可能存在的问题等 信息存储 大多数计算机使用8位的块&#xff0c;或者字节(byte)&#xff0c;作为最小的可寻址的内存单位&#xff0c;而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组&#xff0c…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

基于SSM+JSP的订餐管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

金融疆界:在线支付系统渠道网关的创新设计(一)

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;11.1&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 整个渠道网关的内容预计会分成5篇来讲&#xff1a;1&#xff09;定位、术语、概要设计。2&#xff09;领域模型、状态机设计。3…

数据结构第十三弹---链式二叉树基本操作(上)

链式二叉树 1、结构定义2、手动创建二叉树3、前序遍历4、中序遍历5、后序遍历6、层序遍历7、计算结点个数8、计算叶子结点个数9、计算第K层结点个数10、计算树的最大深度总结 1、结构定义 实现一个数据结构少不了数据的定义&#xff0c;所以第一步需要定义二叉树的机构。 typ…

学习笔记-mysql基础(DDL,DML,DQL)

一.DDL DDL,Data Definition Language,数据库定义语言,该语言包括以下内容: 对数据库的常用操作对表结构的常用操作修改表结构 1.对数据库的常用操作 -- 查看所有的数据库 show databases -- 创建数据库 create database [if not exists] test [charsetutf8] -- 切换 选择 …