数据库的数据类型

文章目录

  • 前言
  • 一、数据类型
    • 数据类型分类
    • 数值类型
    • 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.mfbz.cn/a/316776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录汇川:H5U与Factory IO测试12

主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 自动程序 Factory IO配置: 实际动作如下: Factory IO测试12

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段:职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段:安全运营项目1. 操作系统安全配置与加…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

深入理解Lock Support

第1章:引言 大家好,我是小黑,今天咱们要聊聊Lock Support。Lock Support是Java并发编程的一块基石,它提供了一种非常底层的线程阻塞和唤醒机制,是许多高级同步工具的基础。 为什么要关注Lock Support?线程…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管,连接的阵列,非常适合逻辑接口电平数字电路(例 如 TTL,CMOS 或PMOS 上/NMOS)和较高的电流/电压,如电灯电磁阀,继电器,打印机或其他类似的负…

Java项目:05 停车管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 课题意义: 随着时代和科技的进步,人们的生活水平越来越高,私家车的数量不断上涨,随之产生了一些问题&…

力扣:209.长度最小的子数组

1.题目分析: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 …

电子学会2023年12月青少年软件编程(图形化)等级考试试卷(四级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(四级) 分数:100 题数:24 一、单选题(共10题,共30分) 1. 运行下列程序,输入“abcdef”,程序结束后,变量“字符串”是?( )

PLAN B KRYPTO ASSETS GMBH amp; CO. KG 普兰资产管理公司

引领加密技术不断演进 PLAN B KRYPTO ASSETS普兰资产管理以其独创的「Trident Strategy三叉戟模型」技术为基础,持续推动加密技术的发展,打造 Schutz(舒茨盾) AI 金融隐私匿名公链。致力于提供高效的技术服务,基于机构…

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…

【数字图像处理】素描风格变换(二)—— 代码实现

在绘画风格中,素描风格是一种以黑白灰(或单色)色调为主的绘画风格,注重表现物体的轮廓、结构、明暗关系等细节。在数字图像处理中,素描风格变换是一种图像风格变换的过程,用于呈现素描的视觉效果。本文主要记录使用紫光同创 PGL22G 平台,实现素描风格变换的主要代码。 目…

SwiftUI之深入解析高级布局的实战教程

一、自定义动画 首先实现一个圆形布局的视图容器 WheelLayout: struct ContentView: View {let colors: [Color] [.yellow, .orange, .red, .pink, .purple, .blue, .cyan, .green]var body: some View {WheelLayout(radius: 130.0, rotation: .zero) {ForEach(0.…

如何在使用JetBrains IDE时文本编辑更高效?这个IdeaVim好用

IdeaVim 插件已经发布一段时间了,它帮助开发者利用 Vim 的强大功能扩展 JetBrains IDE。JetBrains 内部有一个专属团队维护此插件,这为您提供了两项优势:以键盘为中心的编辑器和 IDE 的支持。 Vim为文本中的跳转和修改带来了许多灵活性&…

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事,Google 了 N 篇文章竟然没有一篇是可以跑起来的! 少部分教程是给出了自我矛盾的配置(是的,按照贴出来的代码和配置,他自己都跑不起来),大部…

[Altium Designer] AD PCB相同模块的布局步骤

针对原理图完全相同的模块布局布线很有帮助;一定要对应模块相同操作才具有可行性。 1、原理图中选取一路模块的元器件,快捷键【T→S】即可在对应的PCB中选取对应的元器件;跳转到PCB,快接方式改变右边属性,【ctrla】 …

代币合约 ERC20 Token接口

代币合约 在以太坊上发布代币就要遵守以太坊的规则,那么以太坊有什么规则呢?以太坊的精髓就是利用代码规定如何运作,由于在以太坊上发布智能合约是不能修改和删除的,所以智能合约一旦发布,就意味着永久有效,不可篡改…

【信号与系统】【北京航空航天大学】实验一、信号的MATLAB表示及信号运算

一、实验目的 1、初步掌握 MATLAB 仿真软件的使用; 2、学习使用 MATLAB 产生基本时域信号,并绘制信号波形; 3、学习利用 MATLAB 实现信号的基本运算; 4、利用 MATLAB 分析常用的连续时域信号。 二、实验内容 1、 生成连续信号 …

AI软件开发:探索原理、挑战与未来趋势

AI软件开发已经成为当前最热门和具有前景的技术领域之一。随着人工智能技术的快速发展,AI软件的应用范围也在不断扩大。本文将主要探讨AI软件开发的原理、挑战以及未来的趋势。 首先,AI软件开发的原理是基于机器学习和深度学习算法。机器学习是一种通过…

腾讯云免费云主机有哪些?2024年更新

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

GC6153步进电机驱动芯片——低噪声、低振动,应用于摄像机,机器人等产品上

GC6153是双通道5V低压步进电机驱动器具有低噪声、低振动的特点,特别适用于相机的变焦和对焦系统,万向节,摇头机和其他精密,低噪声扫描隧道显微镜控制系统。该芯片为每个通道集成了256微步驱动器通过SPI和I2C接口,用户可…