【MySQL — 数据库基础】深入解析MySQL常用数据类型
常用数据类型
创建完数据库之后,就要在数据库中创建表,表中存储的数据记录,一条记录由不同的列组成,每条列都需要自己的类型;并且表中的多个行对应的列的数据类型,都必须是相同的;
那么每个列需要什么要的数据类型?
我们重点介绍下面这几种类型:
1. 位类型
BIT[(M)]
- bit[(M)] : 位字段类型。
- M表示每个值的位数,M的范围 [ 1 , 64 ],如果M被忽略,默认为1;
- 存储数值范围 [ 0 , 2^M-1 ] ;
一个字节插入测试:
mysql> insert test1 values(1,1);
Query OK, 1 row affected (0.01 sec)mysql> insert test1 values(1,0);
Query OK, 1 row affected (0.01 sec)mysql> insert test1 values(1,2);
ERROR 1406 (22001): Data too long for column 'num' at row 1
说明:当 bit 的位数位1时只能插入0/1,插入其他则报错。
测试:
mysql> select *from test1;
+------+------------+
| id | num |
+------+------------+
| 1 | 0x01 |
| 1 | 0x00 |
+------+------------+
2 rows in set (0.00 sec)
2. 整数类型
TINTINT
大小为1个字节,对应 Java 类型为 Byte ,范围是 [ -128 , +127 ]
有符号越界测试案例:
mysql> create table test1(num tinyint);
Query OK, 0 rows affected (0.02 sec)mysql> insert into test1 values(-128);
Query OK, 1 row affected (0.00 sec)mysql> insert into test1 values(127);
Query OK, 1 row affected (0.00 sec)mysql> insert into test1 values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
说明:
如果我们向MySQL特定的类型中插入不合法的数据,MYSQL一般都是直接拦截不让我们对应操作! 反之如果我们有数据已经插入到MySQL中,那么数据一定是合法的。简而言之,这也是对数据类型的一种约束!
SMALLTINT
大小为2个字节,对应 Java 类型为 Short ,范围是 [ -32768 , +32767 ]
INT
大小为4个字节,对应 Java 类型为 Integer
BIGINT
大小为8个字节,对应 Java 类型为 Long
注意
表示整数的 TINYINT , SMALLINT , INT , BIGINT 这几个类型,在 SQL 中使用的名字和主流语言不同,主要是因为 SQL 其实是一个相当古老的编程语言; 后来随着 Java 影响力越来越大,人们越来越认可 Java 中 Byte , Short , Integer , Long 这套类型的名字。
虽然 TINYINT 和 SMALLINT 更节省空间,但是使用时很容易超出数据范围,所以还是更推荐使用 INT 或者 BIGINT;因为随着时代发展,硬件设备(内存/硬盘)成本是越来越低的,相比之下,程序猿的开发成本(时间)是更加尖锐的矛盾;
3. 浮点类型
FLOAT(M,D)
表示4个字节的单精度浮点数 ,M表示浮点数长度,D表示小数点位数;
DOUBLE(M,D)
表示8个字节的双精度浮点数,M表示浮点数长度,D表示小数点位数;
比如 double(3,1)表示数字长度是3位,小数点后是1位,后续如果针对数据库数据进行插入/修改,此时新的数据就得遵守这个规则:
如 10.0,99.5 就是合法的数据,可以插入到数据库中,但是如果是1.00,1,123.0 就是非法的数据,尝试插入数据库的时候,就会报错;
注意
MYSQL 也是遵循 IEEE754 标准来表示浮点数;类似于科学计数法(二进制)的方式来表示浮点数,这种表示方法有一个比较大的缺陷:
很多时候小数是不能精确存储和表示的,这就导致在进行某些计算的时候,会出现误差;所以严禁使用两个浮点数进行比较相等;
不仅仅是数据库中有这样的缺陷,在C , JAVA , C++ , JS....这些主流语言也有类似的问题;如果针对浮点数,要比较相等,需要作差,看差值是否小于一定的误差范围;只要小于一定的范围就可以认为是近似相等;
4. 定点数类型
DECIMAL(M,D) / NUMERIC(M,D)
这两个类型差别不大,一般使用 decimal 类型即可;decimal 在 Java 中对应类型为 BigDecimal;
注意
DECIMAL(M,D) / NUMERIC(M,D) 也是用于表示小数,但是不再使用IEEE754 这一套标准,而是自己设定了一套存储格式:
- 相当于“变长的”,付出更多空间,使存储的数据更精确;
- 同时也付出了更多时间代价,拿着两个 decimal 计算的速度远远小于拿着两个 double 进行计算;
IEEE754 这套标准虽然有明显的缺陷,但是仍然成为各种主流语言表示浮点数的方法;因为这套标准对于硬件(CPU,内存......)是最友好的;运算速度也快,存储空间也小;
5. 无符号类型
在 mysql 官方文档中,明确说明不建议使用无符号类型,甚至在未来更高版本的 mysql 中,无符号类型可能会删去,因为无符号类型作用不大,但是使用可能会带来很多问题;
无符号问题的最大问题就是:两个无符号类型作减法的时候,容易出现溢出,导致结果为一个很大的正数;这样的问题可能会严重影响程序逻辑,带来非常严重的Bug。
6. 字符串类型
VARCHAR(SIZE)
char[SIZE] 是一个定长的字符串类型,如果设定小了,容易不够用,设定大了,容易浪费空间(浪费的不是内存,而是硬盘,mysql 数据库使用硬盘存储数据)。
因此一般使用 varchar(SIZE),表示可变长字符串(可指定最大长度),就可以解决上述问题;
强调:
varchar(SIZE) 的单位是字符,不是字节,尤其是在 utf8 编码方式下,一个字符等于好几个字节。
TEXT
TEXT 也是可变长字符串,不需要指定最大长度,完全根据我们存储的数据自适应;
varchar 可以指定最大长度,TEXT则没办法指定最大长度,因此 TEXT 的大小难以预估,varchar 由于指定最大长度,程序猿很容易预估出表里面的数据量有多少,所以更推荐使用 varchar 。
MEDIUMTEXT
VARCHAR(SIZE) 的大小为 0-65,535字节 ,但是在一些特定场景下,就是需要比较长的数据量,导致 varchar 不够用,就可以使用 mediumtext 类型。
BLOB
前面的几个类型存储的是文本数据,blob 存储的是二进制数据;
- 计算机存储和表示的数据,都是二进制的方式(内存,硬盘,CPU....流转的数据,都是010101这样的数据);
- 文本是一种特殊的情况,文本数据里面的二进制内容,都可以在对应的码表(gbk, utf8...)上查询到对应的合法字符;
- 区分文本数据和二进制数据,就可是否可以在码表上查询到对应的合法字符;
- 一般情况下,字符串一般都是文本数据,使用数据库存储就使用 varchar 存储;
- 图片,视频,音频,可执行文件都是二进制数据,使用数据库存储就使用 blob 存储;但是 blob 只能表示最大 64kb,所以一般不建议直接使用数据库存储图片,视频,音频等内容;
- 数据库 SQL 里面提供了丰富的功能,但是这些功能只能针对数字,字符串,时间日期才有效,存储二进制数据,上述丰富的功能就没有什么用了;
- 另一方面,数据库往往是一个系统中,执行效率比较低的环节,容易造成性能瓶颈,把二进制数据提出来,不使用数据库保存,也能有效降低数据库负担;
7. 时间日期类型
timestamp 表示时间戳,使用 timestamp 可以得到系统的时间戳(整数),以 1970年1月1日0时0分0秒为基准时间,计算当前时间和基准时间的秒数/毫秒数/微妙数只差;
计算机理解时间戳非常方便,但是人理解起来就比较困难,往往具体显示时间的时候,就需要计算机把时间戳转换成 年月日时分秒 这样的格式化时间;
但是大小为 4个字节版本的时间戳 timestamp 不推荐使用,因为范围是 [1970 , 2038] ,超出 2038年就会造成溢出;
当前时间戳为 17 亿左右大小的数字,而 timestamp 最大是 21 亿,到 2038年就无法存下这个数字了;
计算机发展历史上,有一个知名问题,就是千年虫问题:
在2000年之前,计算机表示年份是使用末尾的两位数字表示的,导致在2000年到达的时候,年份从99->00,因为 99 > 00,所以后续进行比较大小的操作就乱套了,这个问题给但是的计算机行业造成了非常大的冲击,很多程序因此产生了严重的 bug !!!!
所以在 2038 年,这样的剧情很可能会再次上演,这是一件细思极恐的事情;因此,在 2038 年,尽量不要随便出去坐飞机,轮船,出去探险这样的事情(bushi)。
相关文章:

【MySQL — 数据库基础】深入解析MySQL常用数据类型
常用数据类型 创建完数据库之后,就要在数据库中创建表,表中存储的数据记录,一条记录由不同的列组成,每条列都需要自己的类型;并且表中的多个行对应的列的数据类型,都必须是相同的; 那么每个…...
Linux高级--3.3.1 C++ spdlog 开源异步日志方案
一、基本介绍 spdlog 是由 Gustav S. 在 2015 年开发的一个高性能 C 日志库。开发这个库的主要目的是为了提供一个非常快速、轻量、易于使用的日志工具,特别适合需要高性能、低延迟日志记录的 C 应用程序。(由于源码现在比较难下载,我把压缩…...

电梯系统的UML文档05
Dispatcher 不控制实际的电梯组件,但它在软件系统中是重要的。每一个电梯有一个ispatcher,主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象,它…...
如何使 LLaMA-Factory 支持 google/gemma-2-2b-jpn-it 的微调
如何使 LLaMA-Factory 支持 google/gemma-2-2b-jpn-it 的微调 追加, "Gemma-2-2B-JPN-Instruct": {DownloadSource.DEFAULT: "google/gemma-2-2b-jpn-it",},修改 constants.py, vi ./src/llamafactory/extras/constants.py---"…...
MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换
在MySQL中,经常需要在 DATE、TIMESTAMP 和字符串之间进行相互转换。以下是一些常见的转换方法: 1. 字符串到日期/时间类型 字符串转 DATE: 使用 STR_TO_DATE() 函数将字符串转换为 DATE 类型。你需要提供字符串的格式。 SELECT STR_TO_DATE(2024-08-24,…...

HarmonyOS NEXT开发进阶(十):UIAbility 组件交互
文章目录 一、前言二、启动应用内的 UIAbility三、启动应用内的UIAbility并获取返回结果四、启动其他应用的UIAbility五、启动其他应用的 UIAbility 并获取返回结果六、启动 UIAbility 的指定页面6.1 调用方 UIAbility 指定启动页面6.2 目标 UIAbility 首次启动6.3 目标UIAbili…...
深入探索Math.NET:开启高效数值计算之旅
一、引言 在当今数字化时代,数值计算已然成为科学研究、工程设计、金融分析等众多领域的核心驱动力。从探索宇宙奥秘的物理学计算,到优化建筑结构的土木工程设计,再到预测市场趋势的金融建模,数值计算的身影无处不在,…...

AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发
AI编程工具横向评测–Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发 数据分析类应用的开发,指的是首先进行数据分析,比如统计学分析、机器学习模型的构建等,然后将分析的流程开发成数据分析类的工具,或者将数据分…...

【2024 CSDN博客之星】技术洞察类:从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)
目录 一、引言 1.1 本篇文章侧重点 1.2 技术洞察—MoE(Mixture-of-Experts,混合专家网络) 二、MoE(Mixture-of-Experts,混合专家网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场…...

Linux——入门基本指令汇总
目录 1. ls指令2. pwd3. whoami指令4. cd指令5. clear指令6. touch指令7. mkdir指令8. rm指令9. man指令10. cp指令11. mv指令12. cat指令13. tac指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal指令20. find指令21. which指令22. alias指令23. grep…...

54,【4】BUUCTF WEB GYCTF2020Ezsqli
进入靶场 吓我一跳,但凡放个彭于晏我都不说啥了 提交个1看看 1 and 11 1# 还尝试了很多,不过都被过滤了,头疼 看看别人的WP 竟然要写代码去跑!!!,不会啊,先用别人的代码吧…...
【Leetcode 热题 100】45. 跳跃游戏 II
问题背景 给定一个长度为 n n n 的 0 0 0 索引 整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。 每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i i i 向前跳转的最大长度。换句话说,如果你在 n u m s [ i ] nums[i] nums[i…...

C/C++ 时间复杂度(On)
定义: 在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低…...

【STM32-学习笔记-10-】BKP备份寄存器+时间戳
文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换(time.h函数介绍)Ⅰ、time()Ⅱ、mktime()…...
React 中hooks之 React.memo 和 useMemo用法总结
1. React.memo 基础 React.memo 是一个高阶组件(HOC),用于优化函数组件的性能,通过记忆组件渲染结果来避免不必要的重新渲染。 1.1 基本用法 const MemoizedComponent React.memo(function MyComponent(props) {/* 渲染逻辑 *…...

日志收集Day001
1.ElasticSearch 作用:日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml(这里yy做了别名,过滤掉空行和注释行) yy /etc/el…...

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航
在机器人技术的发展中,“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中,“大脑”作为机器人的核心决策单元,承担着复杂任务规划、环境感知和决策制定的重要角色,而“小脑”则专注于运动控制和实时调整。这种分工明确…...
python程序跑起来后,然后引用的数据文件发生了更新,python读取的数据会发生变化吗
在 Python 程序运行过程中,如果引用的数据文件被更新,程序能否读取到更新后的数据,取决于以下几个因素: 1. 是否动态读取文件 如果 Python 程序在运行过程中动态读取文件(例如通过循环或定时机制反复打开文件读取&…...

VSCode最新离线插件拓展下载方式
之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…...
算法题目总结-栈和队列
文章目录 1.有效的括号1.答案2.思路 2.最小栈1.答案2.思路 3.前 K 个高频元素1.答案2.思路 4.用栈实现队列1.答案2.思路 5.删除字符串中的所有相邻重复项1.答案2.思路 1.有效的括号 1.答案 package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Descripti…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...