disgare 的博客
首页
博客
分类
标签
首页
博客
分类
标签
  • 网络

    • 计算机网络学习笔记
    • 网络安全相关
    • 域名和子网掩码
    • CORS 跨域资源共享
    • DNS、HTTP 与 HTTPS
    • Server-Sent Events (SSE)
    • WebSocket 长连接
  • 计算机基础

    • 操作系统 IO 相关知识
    • 操作系统学习笔记
    • 程序的机器级表示
    • 音频文件基础
    • 正则表达式相关概念
    • ffmpeg 的安装以及实现音频切分功能
    • Hex 和 Base64 编码
    • XML 的使用
  • 数据结构与算法

    • 动态规划算法学习笔记
    • 基于比较的排序算法的最坏情况下的最优下界为什么是O(nlogn)
    • 集合与数据结构学习笔记
    • 面试常见算法总结
    • 算法导论第二部分排序学习笔记
    • 算法导论第一部分学习笔记
  • Java

    • 对象之间的映射与转换
    • 反射学习笔记
    • 泛型相关概念
    • 关于 boolean 类型的坑
    • 如何使用 lambda 表达式实现排序
    • CompletableFuture 相关用法
    • CompletableFuture 源码浅要阅读
    • FutureTask 源码阅读
    • Guava 常用 API
    • Guava 源码阅读:Multimap 相关
    • Jackson 的各种使用
    • Java 的 Excel 相关操作
    • java 的常见性能问题分析以及出现场景
    • java 基础知识
    • JAVA 枚举的基础和原理
    • Java 图片文件上传下载处理
    • Java 序列化
    • Java 异常
    • Java 语法糖
    • Java 中关于字符串处理的常用方法
    • Java 中强、软、弱、虚引用
    • JAVA 注解小结
    • Java Http 访问框架
    • Java Stream 的使用
    • Java8 新特性
    • netty 学习笔记
    • Scanner 的各种用法
    • Servlet 学习笔记
    • String、StringBuffer、StringBuilder 学习笔记
  • JVM

    • 虚拟机执行子系统
    • JVM 自动内存管理
    • Linux 中 JVM 常用工具以及常见问题解决思路
  • Linux

    • crontab 表达式
    • Linux 常见命令
    • Linux 文件系统
  • 中间件

    • 关于定时任务原理
    • 详解 kafka
    • ES 搜索引擎
    • flink 提交流程
    • Grape-RAG
    • Hadoop 基础原理
  • 多线程

    • 多线程基础学习笔记
    • 简单了解并发集合
    • 如何手写单例
    • 深入理解 java 多线程安全
    • 生产者消费者问题
    • 线程池作用、用法以及原理
    • AQS 组件
    • ThreadLocal 原理以及使用
  • 非关系型数据库

    • Redis 集群
    • Redis 数据结构、对象与数据库
    • Redis 学习笔记
  • 关系型数据库

    • B+ 树的插入、删除和数据页分裂机制
    • MySQL 的 binglog、redolog、undolog
    • MySQL 的记录存储结构、存储引擎与 Buffer Pool
    • MySQL 基本的特性
    • MySQL 开发规范
    • MySQL 事务与锁与 MVCC
    • MySQL 数据类型、字符集相关内容
      • 字符集
      • 类型介绍
      • char(5)与 int(5)
      • int、char 以及 varchar 的性能对比
      • 字符串和数值作比较的时会发生什么
      • 为什么要非业务属性的自增 Id 做主键
      • 数据库字段类型和 Java 的对应关系
      • MySQL 不建议使用 NULL 为索引列?
      • MySQL 中 TEXT 类型最大可以存储多长的文本
    • MySQL 索引与索引优化
    • PostgreSQL 更新数据时 HOT优化
    • PostgreSQL 相关用法
  • Python

    • Python 基础语法
    • Python 学习
  • Spring 项目

    • Lombok 的常用注解
    • maven 小结
    • MyBatis 框架的使用
    • MyBatis 重要知识点总结
    • MybatisPlus 的使用
    • Spring 框架基础使用
    • Spring 事务相关
    • Spring IOC 的原理及源码
    • Spring AOP 的使用和原理
    • SpringBoot 的原理
    • SpringBoot 基础使用
    • SpringWeb 重要知识点
  • 分布式

    • 初步了解 docker
    • 从 ACID 到 BASE 事务处理的实现
    • 访问远程服务
    • 分布式 id
    • 分布式缓存相关问题
    • 分布式集群理论和分布式事务协议
    • 分布式架构的观测
    • 分布式一致性算法
    • 负载均衡 Load Balancing
    • 关于分布式系统 RPC 中高可用功能的实现
    • 集群间数据同步的目的
    • 三高问题下的系统优化
    • 数据库分库分表
    • 详解 Spring Cloud
    • Dubbo 基础概念
    • Gossip 协议
    • nginx 学习笔记
    • Protobuf 通信协议
    • Zookeeper 基础学习
  • 架构设计

    • 参数校验与异常处理
    • 抽象方法与设计模式
    • 代码整洁之道
    • 权限系统设计
    • 用低内存处理大量数据
    • 设计模式——策略模式
    • 设计模式——过滤器模式在 Spring 中的实践
    • 状态模式
    • 统一结果返回
    • 为什么要打日志?怎么打日志?打什么日志?
    • 运维监控常见指标含义
    • 资深研发进阶
    • DDD 架构学习笔记
    • Java 常用的规则引擎
    • MVC 架构学习笔记
  • AI

    • 如何编写 Prompt
    • Agent 工程架构
    • LLM 相关内容
    • NLP 相关知识
    • vibe coding 最佳实践
    • windows 下 ollama 迁移到 D 盘
  • 开发工具

    • 如何画时序图、流程图、状态流转图
    • excel 关于 =vlookup 的用法
    • git 的学习以及使用
    • IDEA 插件推荐
    • IDEA 常用快捷键以及调试
    • Shell 脚本
    • swagger 的使用
  • 前端

    • 简单了解前端页面开发
    • 伪静态是什么
    • GitHub Pages 部署教程
    • Vercel 部署教程
    • vue-admin-template 简单使用
    • VuePress 博客搭建指南
  • 项目

    • 面试刷题网——技术方案
    • 影视资源聚合站——技术方案
  • 问题记录

    • 定时任务单线程消费 redis 中数据导致消费能力不足
    • 提供可传递的易受攻击的依赖项
    • Liteflow 在 SpringBoot 启动时无法注入组件问题 couldn‘t find chain with the id[THEN(NodeComponent)]
  • 金融

    • 股票分析——关于电力
    • 股票技术面——量价关系
    • 股票技术面——盘口
    • 股票技术面——基础
    • 基础的金融知识
    • 基金与股票
    • 韭菜的自我总结
    • 聊聊价值投资
  • 其他

    • 程序员职场工作需要注意什么
    • 创业全链路SOP:从灵光一现到系统化增长的实战指南
    • 观罗翔讲刑法随笔
    • 价格和价值
    • 立直麻将牌效益理论
    • 梅花易数学习笔记
    • 压力管理
2023-04-03
关系型数据库
目录

MySQL 数据类型、字符集相关内容

# 字符集

计算机只能存储二进制的数据,所谓字符集就是字符的集合,它设定了字符和二进制的数据的对应关系。把字符转变成二进制的过程叫做编码,二进制数据解析成字符的过程叫做解码

每一套字符集都有自己的编解码规则,乱码就是使用了错误的字符集来解码造成的

来看看常用的字节码吧:

ASCII 应该是最为熟悉的字符集了,它定义了 128 个字符,其中有 33 个控制字符(比如回车、删除)无法显示

但是 ASCII 是美国人发明的,没有考虑到中文如何存储。为了解决这个问题,Unicode 横空出世,它希望将世界上所有的字符都纳入其中。虽然它做到了,不过 Unicode 字符集并没有规定如何使用二进制数据表示这些字符

于是又诞生了 UTF-8 编码,它是一种可变长的字符集,对于中文字符,它使用3个字符来存储;对于英语字母,UTF-8 编码和 ASCII 码是相同的,UTF-8 编码最多四个字节

如何区分变长:那既然它是可变长的,怎么区分某个字节代表的是一个单独的字符还是某个字符的一部分呢?ASCII 码用一个字节表示128个字符,所以它的最高位一定是0,在遇到最高位为0 的情况时用 ASCII 码即可,判断用两个表示与用三个表示的字符也是同理

MySQL 中的 ut8:在 mysql 中定义了默认的 utf-8 是阉割过的字符集,它用1到4个字节来表示字符,全名叫 utf-8mb3

但是 utf8mb3 没有考虑到生僻字以及繁体字,而随着人类的语言越来越抽象,emoji 类型字符也成了常用的字符,因此,我们一般在 mysql 中使用 utf8mb4,它是UTF-8 的完整实现,使用1到4个字节来表示字符

只有 mysql 中有 utf8mb4 的定义,在java程序中是不认得 utf8mb4 的,因此在java中直接定义为utf8即可,而在mysql中则要显示定义utf8mb4

比较规则:在MySQL 中可以设置一些比较规则,按照二进制大小来比较char类型不是在每一种情况下都正确的。比如现在有一个需求,要求A与a是比较出来是相等的字符,这就需要提前设定一些比较规则了。MySQL中默认的比较规则是utf8_general_ci

# 类型介绍

  • int:整型使用int定义,可以设置有符号和无符号(UNSIGNED),一个int占4字节,int后面可以不加(位数),加了也没有意义,同时,还有TINYINT、BIGINT等,类似java中byte、长整形

  • 浮点:MySQL中可以指定浮点数和定点数的精度,浮点型使用 float 或者 double 保存,后面一般是(M,D),M表示该数据的总位数,D表示小数点后面精度。我们还可以使用 DOUBLE PRECISION,该关键字是 FLOAT 关键字的同义词

  • decimal:定点数一般来说比浮点数好,它使用string来存放小数点后的数据,这样就不会出现精度丢失的问题,它也是(M,D)形式的。decimal型的默认整数位为10,小数位为0,即默认为整数

  • varchar:字符型分用于存放较短的字符char(长度不可变,插入的长度比定义小也会使用定义长度的空间,效率较高,后面括号内数字表示可以存放多少字符)和varchar(长度可变,使用插入长度的空间),存储大文本使用text

  • 日期:日期类型有DATE(存放年月日,使用三个字节,时间范围为‘1000-01-01’ to ‘9999-12-31’),DATETIME(存放年月日时分秒,使用八个字节,‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’)

  • DATASTAMP(存放年月日时分秒,使用四个字节,‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’。timestamp 翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数。对于某些时间的计算,如果是以 datetime 的形式会比较困难,假如我是 1994-1-20 06:06:06 出生,现在的时间是 2016-10-1 20:04:50 ,那么要计算我活了多少秒钟用 datetime 还需要函数进行转换,但是 timestamp 直接相减就行。同时timestamp 只占 4 个字节,而且是以 utc 的格式储存, 它会自动检索当前时区并进行转换,这个禁止使用)

  • ENUM 和 SET:有限而且固定值列,比如enum('男', '女')去定义性别,ENUM类型最多允许65536个值,SET类型最多允许64个值,不要使用ENUM,因为数据迁移的时候,他几乎不可能被其他数据库所支持;enum的枚举值对应的索引是从1开始的,可能会造成一些疑惑的问题

# char(5)与 int(5)

1,在每个数据类型后,都可以加数字,这个数字代表这个类型最多多少,比如char(20)代表20个字符,char(5)代表5个字符

2,值得注意的是,int类型后面的数字代表自动补全,不管它设置多少,int型都占4字节;在使用int(3)的时候如果你输入的是10,那么显示给你的字符宽度就为3,会默认给你显示3位,当你不足3位时,会帮你补齐3位,当你超过3位时,就没有任何的影响,不会报错(其他的数据类型比如double,char超过了都会报错),如果你存1000,显示这个值就是1000

# int、char 以及 varchar 的性能对比

当它们同时存放数据的时候,不管是有索引还是无索引,int类型都是最快的,因为整数得益于原生支持,而 char 和 varchar 的性能差不多

# 字符串和数值作比较的时会发生什么

字符串和数值都会转换成浮点数进行比较,字符串在转浮点数时,如果字符串开头是数字,那就一直截取,直到截取到的不是数字是其他字符为止。若开头不是数字,那么转换数值类型的结果就直接取0

# 为什么要非业务属性的自增 Id 做主键

原因1:业务层面

业务主键,就是从业务层面上来反应数据等唯一性,比如订单号,员工编号,商品编号等。这些编号一般都会包含一定的业务含义。比如订单号会拼入下单日期时间,员工编号可能拼入入职时间,商品编号会拼入商品分类缩写等等

非业务主键,就是和业务无关,真正的表数据的唯一标记。一般会采用 bigint 类型的自增列作为非业务主键。非业务主键是数据表真正意义上的主键。主键索引也是基于这个非业务主键来生成的

原因2:技术层面

根据 b+ 树的实现原理,如果不规则插入的话,先查找自己应该被放在哪个位置,再根据 B+ 树自己实现的自适应平衡算法,如果一个节点超过最大值的话它会自己执行叶分裂过程,这样的调整不仅浪费时间,分裂之后的两个节点还只用了一半的空间。这种情况叫中间点(mid point)分裂,同时,这种分裂会导致数据在不同的页面中,变得很离散 在这里插入图片描述 这是 b+ 树的叶分裂算法相关内容:https://blog.csdn.net/sekever/article/details/120156467

如果是自增主键的话,根据 MySQL 自己的优化,它不会执行上面过程,如果插入的数据是自增长的,它会直接把数据添加到最右侧节点下,而旧的节点不用移动。如果最右侧节点满了,它会新生成一个节点来存放数据。这种情况也叫插入点优化 在这里插入图片描述 而这个非业务属性,就保证了自增这一条件,如果是业务属性,不可避免的可能会是字符串类型、非自增形式

# 数据库字段类型和 Java 的对应关系

CHAR、VARCHAR 、LONGVARCHAR ---> String

SMALLINT ---> Short

INTEGER ---> Int

不要用 DOUBLE 和 FLOAT 存放小数,一定会存在误差的,他会近似存储为二进制浮点数

DECIMAL 、 NUMERIC ---> BigDecimal

这两种完全精确表示数值,适合存储货币金额、税率等,计算时不会有舍入误差。他们的存储方式精确存储为字符串

java 中日期类别用 Date 了

DATE ---> LocalDate

TIME(存放时分秒) ---> LocalTime

TIMESTAMP、DATETIME ---> LocalDateTime

TINYINT ---> 自己定义的枚举类

# MySQL 不建议使用 NULL 为索引列?

首先贴上几段官方文档:

You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine. Otherwise, you must declare an indexed column NOT NULL, and you cannot insert NULL into the column.

大意是:如果你选择了 MyISAM,InnoDB,MEMORY 这几个引擎,那么你可以为允许 null 值的字段加上索引,如果不是这几个引擎,那么只能为那些 not null 的字段加上索引,这些字段也无法保存 null 值

MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.

大意是:mysql 可以使用索引来查询 NULL 字段

# MySQL 中 TEXT 类型最大可以存储多长的文本

MySQL 的 TEXT 类型有四种,每种容量不同:

  • TINYTEXT 255 字节 约 127 个汉字
  • TEXT 65,535 字节 (64KB) 约 3.2 万个汉字
  • MEDIUMTEXT 16,777,215 字节 (16MB) 约 800 万个汉字
  • LONGTEXT 4,294,967,295 字节 (4GB) 约 21 亿个汉字
#MySQL
最后更新: 2/23/2026, 9:23:04 AM
MySQL 事务与锁与 MVCC
MySQL 索引与索引优化

← MySQL 事务与锁与 MVCC MySQL 索引与索引优化→

最近更新
01
vibe coding 最佳实践
02-24
02
立直麻将牌效益理论
02-23
03
伪静态是什么
02-08
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式