【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型
一、数据类型分类
二、数值类型
1.bit类型
测试环境ubuntu
基本语法:
bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1
举例:
create table testBit(id int, a bit(8));
insert into testBit values(10,10);
select * from testBit;#当我们进行查询的时候,发现以16进制出现
当我们以十六进制进行输出时,发现是字符A(16进制数,还是十进制中的10)
如果我们添加一个不在范围内的数据,如下图所示,mysql直接拒绝了用户的操作
如果我们向mysql特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作
反过来,如果我们已经有数据被成功插入到mysql中了,一定插入的时候是合法的
所以,mysql中,一般而言,数据类型本身也是一种:约束
这种约束:倒逼程序员,让程序员尽可能进行正确的插入
约束:约束使用者
另外,如果你不是一个很好的使用者,mysql也能保证数据插入的合法性;这样就能够保证数据库中的数据是可预期的,完整的
测试环境Centos
bit使用注意事项:
2.tinyint类型
语法:
tinyint [unsigned]
【测试一】有符号tinyint测试(-128~127):
create table testTinyInt(num tinyint);
insert into testTinyInt values(127);
insert into testTinyInt values(-128);
insert into testTinyInt values(0);
desc testTinyInt;
现在插入越界数值,mysql会拒绝插入
insert into testTinyInt values(128);
insert into testTinyInt values(-129);
【测试二】无符号tinyint测试(0~255)
create table testTinyIntUn(num tinyint unsigned);
insert into testTinyIntUn values (0);
insert into testTinyIntUn values (255);
insert into testTinyIntUn values (128);
select * from testTinyIntUn;
desc testTinyIntUn;
现在插入越界数值,mysql会拒绝插入
insert into testTinyIntUn values(-1);
insert into testTinyIntUn values(-256);
说明:
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的
- 可以通过unsigned来说明某个字段是无符号的
- 根据自己实际情况选择不同类型,虽然不同类型之间只差几个字节,但是用于百万级别,千万级别列表情况下,省下来的不是一芯半点了
3.int类型
语法:
int(M) zerofill
M
:这是可选的参数,用于指定显示宽度。M
的值指定了该字段显示的最小位数。如果插入的数值的位数少于M
指定的位数,那么数值将在左侧填充零以达到指定的宽度。ZEROFILL
:这是一个属性,当与INT
类型一起使用时,如果数值的位数少于指定的宽度,则在数值的左侧填充零。
需要注意的是:
ZEROFILL
不会改变数值的实际存储大小。即使指定了INT(5) ZEROFILL
,整数仍然是按照INT
的标准大小(通常是4字节)存储的。- 如果数值超过了
M
指定的位数,那么ZEROFILL
不会起作用,数值将按原样显示,而不会填充零。 ZEROFILL
自动为该字段添加UNSIGNED
属性,这意味着你不能在该字段中存储负数。
4.float类型
float[(m,d)] [unsigned]:m指定显示长度,d指定小数位置,占用空间4个字节;那么整数部分位数为m-d
【示例一】设计一个表,该表表示的范围是 -99.99~99.99,MySQL在保存值时会进行四舍五入
create table testFloat(id int, salary float(4,2));
insert into testFloat values(1, -99.99);
insert into testFloat values(2, -99.991);#多的这一点被拿掉了
insert into testFloat values(3, 3);
insert into testFloat values(4, 0.1);
只要在当前字段范围内的数值,若该数值的小数位数不满d为,mysql会自动在后面补0
float类型会进行四舍五入,如果五入后超出表示范围,则会报错
insert into testFloat values(5, 99.995);
【示例二】如果定义的是float(4,2) unsigned ,因为把它指定为无符号的数,范围是0~99.99
create table testFloatUn(id int, salary float(4,2) unsigned);
insert into testFloatUn values(100, -0.1);
注意:在MySQL中,使用 FLOAT
或 DOUBLE
数据类型时可能会遇到精度丢失的问题。这是因为 FLOAT
和 DOUBLE
类型是基于IEEE标准的浮点数,它们在内部使用二进制格式来表示数值,这可能导致某些十进制小数不能精确表示。
create table testFloatDe(num float);
insert into testFloatDe values(123456789.987654321);
select * from testFloatDe;
MySQL中的 FLOAT
类型默认精度通常是单精度(32位),它只能保证大约7到8位十进制数的精度。当你插入一个非常大的数值,或者一个包含非常多小数位的数值时,超出这个精度的部分就会被舍入或者直接丢失,为了避免精度丢失,我们使用decimal类型
5.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 表示的精度不一样
create table testDecimal(id int, salary float(10,8), salary2 decimal(10,8));
insert into testDecimal values(1,12.34567890, 12.34567890);
发现decimal的精度更准确,因此如果我们希望某个数据表示高精度,选择decimal
decimal整数最大位数m为65,支持小数最大位数d是30.如果d被省略,默认为0。如果m被省略默认是10
三、文本、二进制类型
1.char类型
语法:
char(L) #固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
create table testChar(name char(20));
insert into testChar values('zhangsan');
insert into testChar values('张三');
无论是汉字还是字符,在mysql中都认为是一个字符
在utf_8中,一个汉字是3个字节;gbk下一个汉字2个字节
char(2)表示可以存放两个字符,可以是字母或者汉字,但是不能超过2个,最多只能是255
create table testChar1(name char(2));
insert into testChar1 values('张三');
create table testChar2(name char(256));
2.varchar类型
语法:
varchar(L) #可变长度字符串,L表示字符长度,最大长度65535个字节
举例:
create table testVarchar(id int, name varchar(20));
insert into testVarchar values(1,'张三');
insert into testVarchar values(2,'lisi');
说明:关于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字节)。
2.1.char 和 varchar比较
实际存储 | char(4) | varchar(4) | char占用字节数 | varchar占用字节数 |
---|---|---|---|---|
abcd | abcd | abcd | 4*3=12 | 4*3+1=13 |
A | A | A | 4*3=12 | 1*3+1=4 |
abcde | 无法存储 | 无法存储 | 数据超出长度 | 数据超出长度 |
如何选择定长或变长字符串?
- 如果数据确定长度都一样,就使用定长,即char类型,比如:身份证,手机号,md5。
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
3.日期和时间类型
常用的日期类型有3中,分别如下:
- date:日期
yyyy-mm-dd
,占用三个字节 - datetime:时间日期
yyyy-mm-dd hh:mm:ss
,占用八个字节 - timestamp:时间戳,从1970年开始经过的秒数,表示格式与datetime一致
yyyy-mm-dd hh:mm:ss
,占用四个字节
案例:
# 创建表
create table birthday(t1 date, t2 datetime, t3 timestamp);# 插入数据 插入两种时间
insert into birthday(t1,t2) values('2001-1-1','2022-6-7 19:00:00');select * from birthday;
ubuntu环境下,添加数据时,时间戳不会自动补上当前时间
centos环境下,添加数据时,时间戳会自动补上当前时间
centos环境下,更新数据时,时间戳会更新当前时间
//创建表
mysql> create table birthday(t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)//插入数据:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:11: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-11-10 21:22:55 | --添加数据时,时间戳自动补上当前时间
+------------+---------------------+---------------------+//更新数据:
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2024-11-10 21:23:09 | -- 更新数据,时间戳会更新成当前时间
+------------+---------------------+---------------------+
四、String类型
1.enum
基本语法:
enum('可选选项1','可选选项2','可选选项3',...)
enum:枚举,“单选”类型;
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号
enum比如可以用在性别字段中,只能选择男女
create table student (name varchar(20), gender enum('男','女'));
insert into student values('张三','男');
insert into student values('李四','女');
如果选择enum之外的值,会报错
insert into student values('王五','保密');
这里的enum类似于C/C++中的enum,第一个选项代表1,第二个代表选项代表2
单选选项对应的数字是从1开始编号的,而不是从0开始编号的,超出enum的选项值会报错
insert into student values('赵六','1');
insert into student values('田七','2');
2.set类型
set:集合,“多选”类型
基本语法:
set('可选选项1','可选选项2','可选选项3',...)
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值。最多可以设置64个选项。
【案例】:有一个调查表votes,需要调查人的喜好,比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]
create table votes(name varchar(20),gender enum('男','女'),# 注意:使用数字标识的时候,就是正常的从1开始的数组下标hobby set('登山','游泳','篮球','武术') #注意:使用数字标识每个爱好的时候,想想Linux权限,采用比特位位置来和set中爱好对应起来
);
插入数据
insert into votes values('张三','男','登山,武术');
insert into votes values('李四','2','登山,武术');
select * from votes where gender=2;
有如下数据,想查找所有喜欢篮球的人:
使用如下查询语句
select * from votes where hobby="篮球";
不能查询出所有爱好为篮球的人
集合查询使用 find_in_set 函数
find_in_set(sub,str_list)
:如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list是用逗号分隔的字符串。
喜好为篮球的人
select * from votes where find_in_set('篮球',hobby);
不建议在enum中使用选项对应的枚举值,集合值的时候采用数字的方式,因为不利于阅读。
set补充
set使用位图的方式存储各个选项,第一个选项对应1(20),第二个选项为2(21),第三个选项为4(2 ^ 2);这样存储可以大大提高存储效率
登山:000001---->1
游泳:000010 —>2
登山+游泳:000011 —>3
相关文章:

【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型
一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法: bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1举例: create table testBit(id i…...

小谈java内存马
基础知识 (代码功底不好,就找ai优化了一下) Java内存马是一种利用Java虚拟机(JVM)动态特性(如类加载机制、反射技术等)在内存中注入恶意代码的攻击手段。它不需要在磁盘上写入文件,…...

简单的二元语言模型bigram实现
内容总结归纳自视频:【珍藏】从头开始用代码构建GPT - 大神Andrej Karpathy 的“神经网络从Zero到Hero 系列”之七_哔哩哔哩_bilibili 项目:https://github.com/karpathy/ng-video-lecture Bigram模型是基于当前Token预测下一个Token的模型。例如&#x…...

【清华大学】实用DeepSeek赋能家庭教育 56页PDF文档完整版
清华大学-56页:实用DeepSeek赋能家庭教育.pdf https://pan.baidu.com/s/1BUweVDeG2M8-t0QaIs3LHQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/8a9473493bb0 《实用DeepSeek赋能家庭教育》基于清华大学研究成果,系统阐述了DeepSeek人工智能技…...

黑洞如何阻止光子逃逸
虽然涉及广义相对论,但广义相对论说的是大质量物体对周围空间的影响,而不是说周围空间和空间中的光子之间的关系。也就是说,若讨论光子逃逸问题,则不必限定于大质量的前提,也就是说,若质量周围被扭曲的空间…...

1.4 单元测试与热部署
本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面,通过JUnit和Mockito等工具,结合SpringBootTest注解,可以模拟真实环境对应用组件进行独立测试,验证逻辑正确性,提升代码质量。具体演示了HelloWorld01和H…...
window系统中的start命令详解
start 是 Windows 系统中用于启动新进程或打开新窗口来运行指定程序或命令的命令。以下是对 start 命令参数的详细解释: 基本语法 start ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENO…...

AI编程工具节选
1、文心快码 百度基于文心大模型推出的一款智能编码助手, 官网地址:文心快码(Baidu Comate)更懂你的智能代码助手 2、通义灵码 阿里云出品的一款基于通义大模型的智能编码辅助工具, 官网地址:通义灵码_你的智能编码助手-阿里云 …...

正则表达式,idea,插件anyrule
package lx;import java.util.regex.Pattern;public class lxx {public static void main(String[] args) {//正则表达式//写一个电话号码的正则表达式String regex "1[3-9]\\d{9}";//第一个数字是1,第二个数字是3-9,后面跟着9个数字…...

原生iOS集成react-native (react-native 0.65+)
由于官方文档比较老,很多配置都不能用,集成的时候遇到很多坑,简单的整理一下 时间节点:2021年9月1日 本文主要提供一些配置信息以及错误信息解决方案,具体步骤可以参照官方文档 原版文档:https://reactnative.dev/docs…...

java错题总结
本篇文章用来记录学习javaSE以来的错题 解答:重载要求俩个方法的名字相同,但参数的类型或者个数不同,但是不要求返回类型相同,所以A正确。 重写还需要要求返回类型相同(呈现父子类关系也可以,但是属于特例&…...
【商城实战(10)】解锁商品信息录入与展示的技术密码
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch
2025年主流原型工具测评:墨刀、Axure、Figma、Sketch 要说2025年国内产品经理使用的主流原型设计工具,当然是墨刀、Axure、Figma和Sketch了,但是很多刚入行的产品经理不了解自己适合哪些工具,本文将从核心优势、局限短板、协作能…...
MDM 如何彻底改变医疗设备的远程管理
在现代医疗行业迅速发展的格局中,医院和诊所越来越依赖诸如医疗平板和移动工作站等移动设备。这些设备在提高工作效率和提供卓越的患者护理方面发挥着关键作用。然而,随着它们的广泛使用,也带来了一系列挑战,例如在不同地点确保数…...

OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…...

用DeepSeek学Android开发:Android初学者遇到的常见问题有哪些?如何解决?
答案来自 DeepSeek Q: Android初学者遇到的常见问题有哪些?如何解决? A: Android初学者在学习过程中常会遇到以下问题及对应的解决方法,按类别整理如下: 一、开发环境问题 Android Studio安装或配置问题 问题:安装失…...

springboot 集成 MongoDB 基础篇
demo架构: Book Controller: package com.zy.controller;import com.zy.entity.Book; import com.zy.service.MongoDbService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.Get…...
大白话html语义化标签优势与应用场景
大白话html语义化标签优势与应用场景 大白话解释 语义化标签就是那些名字能让人一看就大概知道它是用来做什么的标签。以前我们经常用<div>来做各种布局,但是<div>本身没有什么实际的含义,就像一个没有名字的盒子。而语义化标签就像是有名…...

恶劣天候三维目标检测论文列表整理
恶劣天候三维目标检测论文列表 图摘自Kradar 🏠 介绍 Hi,这是有关恶劣天气下三维目标检测的论文列表。主要是来源于近3年研究过程中认为有意义的文章。希望能为新入门的研究者提供一些帮助。 可能比较简陋,存在一定的遗漏,欢迎…...
conda的环境起的jupyter用不了已经安装的包如何解决
当你在使用Conda环境中的Jupyter Notebook时遇到无法读取某些库或模块的问题,通常是由以下几个原因引起的: 环境未激活:确保你已经在正确的Conda环境中激活了Jupyter Notebook。 库未安装:可能你需要的库没有在当前的Conda环境中…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...