MySQL数据库:MySQL的数据类型

作为数据库,必然要存储很多信息。MySQL作为历史悠久的数据库,内部也有很多的数据类型。本期我们就来了解一下它们

目录

数值类型

数值类型表格

tinyint

bit

浮点数

float/double

decimal

字符串类型

char

varchar

char和varchar

共同点

区别

应用场景

日期与时间

enum/set

enum

set


数值类型

数值类型表格

类型分类 具体类型 说明 取值范围(有符号) 存储空间 示例
整数类型 TINYINT 很小的整数 -128 ~ 127 1 字节 age TINYINT
SMALLINT 较小的整数 -32,768 ~ 32,767 2 字节 count SMALLINT
MEDIUMINT 中等大小的整数 -8,388,608 ~ 8,388,607 3 字节 score MEDIUMINT
INT / INTEGER 标准整数 -2,147,483,648 ~ 2,147,483,647 4 字节 id INT
BIGINT 大整数 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8 字节 big_num BIGINT
定点数 DECIMAL(M,D) / NUMERIC 精确小数(金额常用) 取决于 M,D 可变 price DECIMAL(10,2)
浮点数 FLOAT 单精度浮点数 ±1.175E-38 ~ ±3.402E+38 4 字节 weight FLOAT
DOUBLE 双精度浮点数 ±2.225E-308 ~ ±1.798E+308 8 字节 height DOUBLE
位类型 BIT(M) 位字段值 1 ~ 64 位 约 (M+7)/8 字节 flag BIT(1)

tinyint

我们先创建了一个tinyint类型的表

接下来查看数据库

向表中插入数据

查询表中数据

但是要注意数据范围。在C/C++中如果超范围了会截断变量值,但是在MySQL中会直接拒绝并报错。这样是为了让数据库的值是合法的且可预期的

bit

sql 复制代码
BIT(M)   -- M 为 1 到 64,表示存储的位数

创建一个存bit的表

插入数据

浮点数

float/double

sql 复制代码
FLOAT[(M,D)]        -- 单精度浮点数,M 为总位数,D 为小数位数(可选)
DOUBLE[(M,D)]       -- 双精度浮点数

MySQL中浮点数主要是四舍五入的

decimal

在 MySQL 中,DECIMAL 是一种定点数类型,用于精确存储和计算数值,特别适合货币等需要高精度的场景。

sql 复制代码
DECIMAL(M,D)    -- M 为总位数(精度),D 为小数位数(标度)
--M 最大 65,D 最大 30,且 D ≤ M

尽量避免decimal与浮点数整数直接计算,因为会导致decimal出现四舍五入

字符串类型

char

sql 复制代码
char(L);
-- 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

创建一个限定3个字符的表并插入

MySQL中一个汉字是一个字符

varchar

sql 复制代码
varchar(L);
--可变长度字符串,L表示字符长度,最大长度65535个字节

varchar是可变字符串

char和varchar

共同点

特性 说明
定义语法 CHAR(M)VARCHAR(M),其中 M 表示最大字符数(非字节数)。
字符集支持 两者都支持多种字符集(如 utf8mb4),实际存储字节数受字符集影响。
比较行为 默认情况下,比较(=<> 等)时忽略尾部空格(符合 SQL 标准)。
最大长度 CHAR 最大 255 字符,VARCHAR 最大 65535 字符(受行大小限制和字符集影响)。
允许空值 均可定义为 NULLNOT NULL
索引支持 均可创建索引,但 VARCHAR 更常用前缀索引。

区别

对比维度 CHAR VARCHAR
存储方式 固定长度,右侧填充空格M 字符。 可变长度,存储实际字符数 + 1 或 2 字节长度前缀。
检索时尾部空格 默认移除 填充的空格(除非启用 PAD_CHAR_TO_FULL_LENGTH 模式)。 原样保留插入时的尾部空格。
存储效率 空间浪费于填充,适合长度固定的短字符串。 节省空间,适合长度变化大的字符串。
性能 更新时可能更稳定(长度固定,不易产生碎片)。 更新可能导致页分裂,但查询时更节省 I/O(数据更紧凑)。
最大长度 0--255 字符 0--65535 字符(实际受行大小限制)
典型用法 状态码、性别、MD5 值等固定长度标识。 用户名、标题、地址等长度不固定的文本。

应用场景

场景 推荐类型 原因
固定长度标识(如国家代码、MD5、Y/N) CHAR 长度固定,无空间浪费,且避免因填充空格导致的意外行为。
长度变化大的文本(如评论、地址) VARCHAR 节省存储空间,减少 I/O,且尾部空格原样保留符合用户预期。
需要频繁更新的短字符串(如状态) CHAR 固定长度,更新时不易引发行迁移或页分裂。
前缀搜索(如 LIKE 'abc%') VARCHAR 索引更高效,且实际长度短时占用更少索引空间。
存储用户输入且可能包含尾部空格 VARCHAR 保留原始空格,避免因 CHAR 自动移除导致的语义丢失。

日期与时间

MySQL 支持以下核心日期时间类型:

类型 格式 范围(含) 存储空间 精度
DATE YYYY-MM-DD 1000-01-019999-12-31 3 字节
TIME HH:MM:SS-HH:MM:SS -838:59:59838:59:59 3 字节 秒(可选微秒)
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:009999-12-31 23:59:59 5-8 字节 秒/微秒(取决于小数精度)
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC 4 字节 秒/微秒
YEAR YYYY 19012155(或 0000 1 字节

enum/set

enum

sql 复制代码
CREATE TABLE t (
    gender ENUM('male', 'female', 'other')
);

定义时列出所有允许的字符串值。

内部存储为整数索引 (1, 2, 3, ...),对应列表顺序。
'male' 存储为 1,'female' 存储为 2,'other' 存储为 3。

最多可定义 65,535 个枚举元素(实际受列定义长度限制)。

set

sql 复制代码
CREATE TABLE t (
    interests SET('reading', 'music', 'sports', 'travel')
);

定义时列出所有可能的选项。

内部存储为位图(bitmap),每个选项对应一个位(第 1 位对应第一个元素,第 2 位对应第二个,依此类推)。

最多可定义 64 个元素(因为 64 位整数限制)。

实际存储为 1、2、3、4 或 8 字节,取决于元素个数(最多 8 字节)。

本期内容先到这里。

封面图自取:

相关推荐
玄米乌龙茶1233 分钟前
Web Search API 实操:构建智能搜索 Agent
人工智能·笔记·学习
晴天¥4 分钟前
达梦数据库dexp 和 dimp 应用实例
数据库·达梦数据库
Hical_W4 分钟前
深入学习CPP20_协程
学习·github
星幻元宇VR5 分钟前
VR党建互动平台助力党建学习提质增效
科技·学习·安全·vr·虚拟现实
21439658 分钟前
网页如何运行html
jvm·数据库·python
Flying pigs~~13 分钟前
从零到一构建企业级 RAG 问答系统:一个完整的模块化实践指南
数据库·人工智能·缓存·大模型·milvus·知识库·rag
梦想与想象-广州大智汇16 分钟前
告别“内存刺客”!sync-canal-go:轻量mysql实时同步数据到Elasticsearch‌,clickhouse,redis
mysql·elasticsearch·golang·同步数据
2402_8548083717 分钟前
Golang数组和切片有什么区别_Golang数组切片对比教程【通俗】
jvm·数据库·python
2401_8654396319 分钟前
如何在 Go 中精确安装指定版本的模块
jvm·数据库·python
星幻元宇VR23 分钟前
VR施工安全行走平台:沉浸式安全教育新方式
科技·学习·安全·生活·vr