MySql数据库中数据类型
本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库):
目录如下:
目录
数值类型
1. 整数类型
2. bit 类型
3. 浮点数类型
字符串类型
1. char 类型
2. varchar
3. 如何选择 char 和 varchar
日期和时间类型
enum和set
数值类型
数值类型的数据又主要分为两类,整数类型和浮点数类型还有 bit 类型,对于整数类型来说,占多少位就可以表示多少位数的大小,若不在定义变量的后面带上 unsigned 关键字修饰,则为有符号整数,其表示范围为:-2 ^ (n-1) ~ 2 ^ (n - 1) - 1,若带上 unsigned 关键字修饰,则表示的范围为 :2 ^ n - 1,其中 n 代表的是数据类型的位数。
1. 整数类型
对于整数类型,tinyint 数据类型占一个字节、smallint 占用两个字节、mediumint 占三个字节、int 占四个字节、bigint 占八个字节。
我们以 tinyint 类型为例讲解,其余所有的整数类型的操作均和 tinyint 的一致,只是能表示的数据范围不同而已,(tinyint 数据类型为 8 位bit位,一个字节)如下:
当我们向一个类型为 tinyint 类型的变量插入元素的时候,超过对应的范围就会导致我们插入失败,当我们定义一共 tinyint unsigned 元素的变量的时候,当范围超255的时候也会导致报错,如下:
对于如上的操作我们就可得出结论:
1. mysql 中插入数据不合法的数据,会被 mysql 直接给拦截掉,只要我们插入的数据,就一定是合法的数据。
2. mysql 的中数据类型本身就是一种约束,这种约束会倒逼我们去遵守数据类型的使用,保证数据可预期的,完整的。
2. bit 类型
对于 bit 类型来说,定义的时候为 bit(m),其中 m 表示该 bit 类型的数据有多少位,默认值为 1,最大为64,所以 bit 类型的数据的位数范围为:1 ~ 64 位,如下:
如上所示,当我们插入对应的元素的时候,超过 bit 位的位数的时候,就会导致插入失败,同时查看的时候,显示方法和整型类型的数据有所区别(若是其他版本的mysql,可能显示不出对应的 bit 类型的数据,因为可能是按照asc码值显示的时候,整个使用我们就可可以将数据转化位十六进制来显示,如下)。
3. 浮点数类型
对于浮点数类型而言,主要被我们分 float、double 和 decimal 两类,先以 float 为例:语法为:float(m, d) [unsigned]:其中 m 为总显示长度,d 表示小数位数。占用的空间为 4 个字节,如 float(4,2) 表示的范围为 -99.99 ~ 99.99(对于小数的位数已经在定义的时候就已经定下来了,即使我们插入的小数位数没有那么多,都会自动填充0,小数位前的整数就是使用总位数减去小数位数得出,若在 float 后面加上 unsigned 修饰,则只能表示 0 ~ 99.99 的数据),如下:
当我们插入不合法数据的时候,依然会导致插入失败。但是在浮点数中的小数部分遵守五舍六入(小于等于5舍掉,大于等于六进一),如下:
但即使是这样的进位规则,若进入的时候导致数据溢出,还是会导致插入失败。但是对于 float 类型而言,在表示数据较大,或者浮点数较多的时候,也会导致精度缺失,如下:
如上是我们采用默认的 float 类型的数据,当我们使用 double 类型数据的时候,其实也会有精度损失,只能说 double类型能表示的数据范围更大。
当面对精度损失的时候,我们可以使用 decimal 类型来定义变量,如下:
如上所示,当我们使用 float 类型的时候,就会出现一定的数据误差,所以平时我们使用浮点数最好使用 decimal 变量类型精度更高。
float 表示的精度大约是 7 位;
decimal 整数最大位数 m 为65,支持小数最小位数 d 为30,若 d 被省略,默认为 0,若 m 被省略,默认是10。
字符串类型
在 mysql 中的字符串输入的时候,使用单引号和双引号都可以,但常用的为单引号。
1. char 类型
对于 char 类型的语法为:char(L),固定长度的字符串,L 是可以存储的长度,单位为字符,最大长度为 255,如下:
如上所示,当我们将 name 变量定义为 char(2) 类型的数据,这个时候我们插入对应的字符,超过两个的时候,就会报错,在 mysql 中的 char 类型中存储的数据是 字符,而不是字节,特别是在 utf8 编码下的字符,一个字符占3个字节,所以可以存下对应数量的汉字。
2. varchar
varchar 为可变长字符串,varchar(L),可变长字符串,L 表示字符串长度,最大长度为 65535 个字节。如下:
关于 varchar(L)中的 L 到底是多大,这个 L 的值和编码密切相关:
varchar 长度可以指定为0 到 65535 之家的值,但有 1 ~ 3 个字节用于记录数据大小,所以有效字节数是 65532;
但是需要注意的是,这个 varchar 类型的单位是字节,所以在 utf8 编码下的最多能存放 65532/3=21844 个字符,我们在定义的时候也只能最多定义 21844 个字符,若编码是 gbk 编码,则最多定义 65532/2=32766 个字符。如下:
当我们在 gbk 编码下的数据库中创建对应的表的时候,最多定义 32766 个长度。
3. 如何选择 char 和 varchar
char 和 varchar 的对比,在 utf8 编码下:
1. 对于 char 类型,定义长度为 L,字节数为 3*L;
2. 对于 varchar 类型,定义长度为 L,实际插入字符长度为 n,占字节数为 3 * n + 1;
那么我们如何选择 char 和 varchar 类型呢?
1. 若数据确定长度都一样长,我们就使用 char,如身份证号码、手机号 2. 若数据长度有变化,我们就使用 varchar,比名字,地址(但是最起码要保证存入的长度我们能存进去) 3. 定长的 char 类型比较浪费磁盘空间,但效率较高 4. 边长的 varchar 类型比较节省空间,但效率较低 5. 定长的意义为,直接开辟好空间 6. 边长的意义为,在补偿过自定义范围的情况下,用多少开辟多少
日期和时间类型
常用的日期有一下三个:
date 日期:' yyyy-mm-dd ',占用三个字节
datetime 时间日期格式:' yyyy-mm-dd HH:ii:ss ' 表示范围从1000 到 9999,占用8字节
timestamp 时间戳,从1970 年开始,格式和 datetime 一样,但不同的是 timestamp 的值更新之后会是当前的最新值,若不更新就是创建时候的值,如下,创建一个 birthday 的表:
mysql> create table birthday (-> t1 date,-> t2 datetime,-> t3 timestamp-> ); Query OK, 0 rows affected (0.02 sec)mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); Query OK, 1 row affected (0.00 sec)mysql> select * from birthday; +------------+---------------------+---------------------+ | t1 | t2 | t3 | +------------+---------------------+---------------------+ | 1997-07-01 | 2008-08-08 12:01:01 | 2024-10-23 21:46:49 | +------------+---------------------+---------------------+ 1 row in set (0.00 sec)mysql> update birthday set t1='2022-1-1'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from birthday; +------------+---------------------+---------------------+ | t1 | t2 | t3 | +------------+---------------------+---------------------+ | 2022-01-01 | 2008-08-08 12:01:01 | 2024-10-23 21:48:42 | +------------+---------------------+---------------------+ 1 row in set (0.00 sec)
如上所示,假若我们创建出的 timestamp 类型的数据,在插入时会自动更新成当前时间,但是之后就不会改变了,只有当我们更新表中值的时候,timestamp 类型数据的值就会自动更新
enum和set
枚举类型的语法:enum('选项1', '选项2', '选项3',...) ---> 单选类型
对于枚举的设定,只是提供了若干选项的值,最终在一个单元格中,实际只存储了其中一个值,而且处于效率来说,这些值实际存储的是数字,因为这些选项的每个选项值依次对应如下数字:1,2,3,4,……最多到65535个,所以当我们添加枚举值的时候,也可以添加这些对应的数字编号。
集合类型的语法:set('选项值1', '选项值2', '选项值3',...) ---> 多选类型
该设定只是提供了若干选项的值,最终一个单元格中,设计可存储了其中任意多个值,而且出于效率考虑,这些值实际存储的是数字,因为这些选项的每个 选项值依次对应如下数字:1 2 4 8 16 32 64…… 最多64个
注:在添加枚举值、集合值的时候不建议使用数字表示,因为不利于阅读。
如下:
mysql> CREATE TABLE votes (-> username VARCHAR(32),-> hobby SET('登山', '游泳', '篮球', '武术'),-> gender ENUM('男', '女')-> ); Query OK, 0 rows affected (0.02 sec)mysql> mysql> insert votes ('张山', '登山,武术', '男'); Query OK, 1 row affected (0.00 sec)mysql> insert votes values ('小红', '登山,游泳', '2'); Query OK, 1 row affected (0.00 sec)mysql> select * from votes where gender=2; +----------+---------------+--------+ | username | hobby | gender | +----------+---------------+--------+ | 小红 | 登山,游泳 | 女 | +----------+---------------+--------+ 1 row in set (0.00 sec)
当我们在表中查找有关集合元素的时候,不能完全找到对应的元素,如下:
mysql> select * from votes; +----------+---------------+--------+ | username | hobby | gender | +----------+---------------+--------+ | 张山 | 登山,武术 | 男 | | 小红 | 登山,游泳 | 女 | | 王明 | 登山,篮球 | 男 | | 小刘 | 登山 | 男 | +----------+---------------+--------+ 4 rows in set (0.00 sec)mysql> select * from votes where hobby='登山'; +----------+--------+--------+ | username | hobby | gender | +----------+--------+--------+ | 小刘 | 登山 | 男 | +----------+--------+--------+ 1 row in set (0.00 sec)
如上所示,当我们使用查找语句查找 hobby 为登山的时候,只能找到刚好为登山的,不能找到其中有登山的,这个时候我们可以使用函数 find_in_set(sub,str_list),使用方法如下:
mysql> select * from votes where find_in_set('登山', hobby); +----------+---------------+--------+ | username | hobby | gender | +----------+---------------+--------+ | 张山 | 登山,武术 | 男 | | 小红 | 登山,游泳 | 女 | | 王明 | 登山,篮球 | 男 | | 小刘 | 登山 | 男 | +----------+---------------+--------+ 4 rows in set (0.00 sec)
相关文章:

MySql数据库中数据类型
本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库): 目录如下: 目录 数值类型 1. 整数类型 2. …...

Godot中的信号
目录 概念 signal connect方法连接Callable 信号要求参数 查看信号 连接信号 监听信号 Button - text属性 pressed 连接源 「按钮」的信号连接 使用代码,将方法与信号相连接 节点的connect方法 节点直接使用emit_signal方法通过字符串的方式触发信号…...
vba学习系列(8)--指定列单元格时间按时间段计数
系列文章目录 文章目录 系列文章目录前言一、背景二、VBA总结 前言 一、背景 时间格式:00:00:00 时间段格式:00:00:00 - 01:00:00 计数N列单元格时间位于时间段内的行数 二、VBA 代码如下(示例): Sub AssignTimeSeg…...

大型企业软件开发是什么样子的? - Web Dev Cody
引用自大型企业软件开发是什么样子的? - Web Dev Cody_哔哩哔哩_bilibili 一般来说 学技术的时候 我们会关注 开发语言特性 ,各种高级语法糖,底层技术 但是很少有关注到企业里面的开发流程,本着以终为始(以就业为导向…...

【stm32】DMA的介绍与使用
DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA(存储器到存储器的数据转运)程序编写: 8、ADC连续扫描模式DMA循环转运DMA配置:程序编写: 1、DMA简介 DM…...

哈希表的魔力
哈希表与字典 普遍存在一种误解,认为“哈希表”和“字典”这两个术语可以互换。这种观念从根本上是不准确的,至少在计算机科学领域是如此。 字典是将键映射到值的数据结构的一般概念。而哈希表是字典的具体实现。 本质上,字典扮演着一个总体…...

《YOLO 目标检测》—— YOLO v3 详细介绍
!!!!!!!!!!!!!还未写完!!!!!!!…...

WNN 多模态整合 | Seurat 单细胞多组学整合流程
测试环境:CentOS7.9, R4.3.2, Seurat 4.4.0, SeuratObject 4.1.4 2024.10.23 # WNN library(ggplot2) library(dplyr) library(patchwork)1. 导入数据 (1). load counts of RNA and protein dyn.load(/home/wangjl/.local/lib/libhdf5_hl.so.100) library(hdf5r)…...

【Linux】磁盘文件系统(inode)、软硬链接
文章目录 1. 认识磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构 2. 引入文件系统2.1 EXT系列文件系统的分区结构2.2 inode 3. 软硬链接3.1 软链接3.2 硬链接 在讲过了内存文件系统后,我们可以知道文件分为两种: 打开的文件(内存中)未…...

网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析
作者简介:徐一丁,北京小西牛等保软件有限公司解决方案部总监,网络安全高级顾问。2000年开始从事网络安全工作,主要领域为网络安全法规标准研究、金融行业安全咨询与解决方案设计、信息科技风险管理评估等。对国家网络安全法规标准…...

九、pico+Unity交互开发——触碰抓取
一、VR交互的类型 Hover(悬停) 定义:发起交互的对象停留在可交互对象的交互区域。例如,当手触摸到物品表面(可交互区域)时,视为触发了Hover。 Grab(抓取) 概念ÿ…...

老机MicroServer Gen8再玩 OCP万兆光口+IT直通
手上有一台放了很久的GEN8微型服务器,放了很多年,具体什么时候买的我居然已经记不清了 只记得开始装修的时候搬家出去就没用了,结果搬出去有了第1个孩子,孩子小的时候也没时间折腾,等孩子大一点的时候,又有…...

jmeter 从多个固定字符串中随机取一个值的方法
1、先新增用户参数,将固定值设置为不同的变量 2、使用下面的函数,调用这写变量 ${__RandomFromMultipleVars(noticeType1|noticeType2|noticeType3|noticeType4|noticeType5)} 3、每次请求就是随机取的值了...

priority_queue (优先级队列的使用和模拟实现)
使用 priority_queue 优先级队列与 stack 和 queue 一样,也是一个容器适配器,其底层通过 vector 来实现的。与 stack 和 queue 不同的是,它的第一个元素总是它所包含的元素中最大或最小的一个。 也就是说,优先级队列就是数据结…...
VisionPro 手部骨骼跟踪 Skeletal Hand Tracking 虚拟首饰
骨骼手部跟踪由XR Hands Package中的Hand Subsystem提供。使用场景中的Hand Visualizer组件,用户可以显示玩家手部的蒙皮网格或每个关节的几何图形,以及用于基于手部物理交互的物理对象。用户可以直接针对Hand Subsystem编写 C# 脚本,以推断骨…...

class 9: vue.js 3 组件化基础(2)父子组件间通信
目录 父子组件之间的相互通信父组件传递数据给子组件Prop为字符串类型的数组Prop为对象类型 子组件传递数据给父组件 父子组件之间的相互通信 开发过程中,我们通常会将一个页面拆分成多个组件,然后将这些组件通过组合或者嵌套的方式构建页面。组件的嵌套…...
Laravel|Lumen项目配置信息config原理
介绍 Laravel 框架的所有配置文件都保存在 config 目录中。每个选项都有说明,你可随时查看这些文件并熟悉都有哪些配置选项可供你使用。 使用 您可以在应用程序的任何位置使用全局 config 辅助函数轻松访问配置值。 可以使用“点”语法访问配置值,其中…...
2024系统分析师考试---论区块链技术及其应用
试题三论区块链技术及其应用 区块链作为一种分布式记账技术,目前已经被应用到了资产管理、物联网、医疗管理、政务监管等多个领域,从网络层面来讲,区块链是一个对等网络(Peer to Peer,P2P),网络中的节点地位对等,每个节点都保存完整的账本数据,系统的运行不依赖中心化节…...
为您的 Raspberry Pi 项目选择正确的实时操作系统(RTOS)
在嵌入式系统设计中,实时操作系统(RTOS)的选择对于确保项目的实时性能和可靠性至关重要。Raspberry Pi,尤其是其最新的RP2040微控制器,为开发者提供了一个功能强大的平台来实现各种实时应用。本文将探讨如何为您的Rasp…...
鸿蒙应用的Tabs 组件怎么使用
鸿蒙应用中的Tabs组件是一个用于通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。以下是Tabs组件的使用方法: 一、基本结构 Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabB…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...