Pixiv - KiraraShss
数据库数据类型
1966 字
10 分钟
数据库数据类型
数值类型
分为整数类型、定点数类型、浮点数类型、位类型,核心用于存储数字数据。
整数类型(最常用,主键 / 状态 / 数量首选)
| 类型 | 字节数 | 有符号取值范围 | 无符号 (unsigned) 取值范围 | 典型适用场景 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 状态码、性别、布尔值、年龄 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 小范围数量、分类 ID |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中等规模数据 ID、访问量统计 |
| INT/INTEGER | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 表主键、常规业务 ID、数量统计 |
| BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 | 超大主键、雪花 ID、分布式业务 ID |
关键避坑:MySQL 8.0 已废弃INT(11)这类显示宽度设置,它不影响数值的存储范围,仅为旧版本兼容语法。BOOLEAN/BOOL是TINYINT(1)的别名,0 代表 false,非 0 代表 true,无原生布尔类型。
定点数类型(精准数值,金额首选)
| 类型 | 字节数 | 核心特性 | 适用场景 |
|---|---|---|---|
| DECIMAL(M,D) / NUMERIC(M,D) | 动态(M+2 字节左右) | 精准十进制存储,无精度丢失;M = 总有效位数 (1-65),D = 小数位数 (0-30,≤M) | 金额、汇率、精准计量数据 |
示例:DECIMAL(10,2) 表示总位数 10 位,小数 2 位,取值范围-99999999.99 ~ 99999999.99,是电商订单金额的标准选型。
强制规范:所有金融 / 金额类字段必须用 DECIMAL,绝对禁止用浮点数。
浮点数类型(近似数值,非精准场景用)
| 类型 | 字节数 | 精度特性 | 适用场景 |
|---|---|---|---|
| FLOAT | 4 | 单精度,约 6-7 位有效数字 | 科学计算、非精准的浮点数据 |
| DOUBLE | 8 | 双精度,约 15-17 位有效数字 | 非精准的大数据量浮点统计、地理坐标 |
避坑:浮点数是二进制近似存储,会出现0.1 + 0.2 ≠ 0.3的精度丢失问题,严禁用于金额、对账等精准校验场景。
位类型
| 类型 | 字节数 | 特性 | 适用场景 |
|---|---|---|---|
| BIT(M) | 1-8 字节(M 为 1-64) | 存储位字段,M 为位数,默认 1 位,取值 0/1 | 多状态位掩码、布尔开关 |
字符串类型
最常用的类型之一,分为常规文本字符串、二进制字符串、枚举 / 集合三大类,核心用于存储文本、二进制数据。
常规文本字符串(核心高频)
| 类型 | 最大长度(字符) | 存储特性 | 适用场景 |
|---|---|---|---|
| CHAR(M) | 0-255 | 定长字符串,不足 M 位自动补空格,查询效率高 | 固定长度内容:手机号、身份证号、性别编码、UUID |
| VARCHAR(M) | 0-65535(受行大小限制) | 变长字符串,存储实际内容 + 1/2 字节长度前缀,节省空间 | 非固定长度内容:用户名、地址、商品名称、短备注 |
| TINYTEXT | 255 | 短文本,无默认值,不支持普通索引前缀 | 极短的扩展字段、临时备注 |
| TEXT | 65535 | 中等文本,无默认值,行溢出存储 | 文章摘要、评论内容、长备注 |
| MEDIUMTEXT | 16777215 | 长文本,无默认值 | 文章正文、协议内容、长文本日志 |
| LONGTEXT | 4294967295 | 超长文本,无默认值 | 超大文本、JSON 大对象、备份内容 |
- 字符集强制使用utf8mb4,支持完整 UTF-8 字符(含 emoji),避免utf8(别名utf8mb3,仅支持 3 字节,无法存储 emoji)。
- VARCHAR(M)的 M 是字符数,不是字节数:utf8mb4 下 1 个字符最多占 4 字节,MySQL 单行最大容量为 65535 字节,因此 VARCHAR 实际最大可用字符数约 16000 左右。
- 优先用VARCHAR,仅当内容长度固定时用CHAR,查询速度 char 大于 varchar;短文本优先 VARCHAR,避免滥用 TEXT 类型(TEXT 会触发行溢出,查询性能远低于 VARCHAR)。
3个字节用以记录字段大小。不区分是否为中文还是字母。
二进制字符串类型
存储二进制字节流,无字符集概念,大小写敏感,适合存储非文本数据。
| 类型 | 最大长度 | 对应文本类型 | 适用场景 |
|---|---|---|---|
| BINARY(M) | 0-255 字节 | CHAR(M) | 固定长度二进制:哈希值、加密串、校验码 |
| VARBINARY(M) | 0-65535 字节 | VARCHAR(M) | 变长二进制:动态加密数据、二进制令牌 |
| TINYBLOB | 255 字节 | TINYTEXT | 极短二进制文件片段 |
| BLOB | 65535 字节 | TEXT | 中等二进制数据:小图片、小文件 |
| MEDIUMBLOB | 16777215 字节 | MEDIUMTEXT | 较大二进制文件:图片、音频片段 |
| LONGBLOB | 4294967295 字节 | LONGTEXT | 超大二进制文件:视频、备份包 |
不推荐在数据库中直接存储大文件(图片 / 视频),建议存文件路径 / 对象存储 URL,仅特殊涉密场景用 BLOB。
枚举与集合类型
| 类型 | 核心特性 | 最大选项数 | 适用场景 |
|---|---|---|---|
| ENUM | 单选枚举,只能选预定义的一个值,底层用数字存储,节省空间 | 65535 | 固定单选选项:性别、订单状态、审核状态 |
| SET | 多选集合,可选择预定义的多个值,底层用位掩码存储 | 64 | 固定多选选项:用户标签、爱好、权限标识 |
- ENUM:ENUM(‘待付款’,‘待发货’,‘已发货’,‘已完成’)
- SET:SET(‘篮球’,‘足球’,‘羽毛球’,‘游泳’)
避坑:ENUM/SET 的选项修改需要执行ALTER TABLE,高并发场景慎用;ENUM 的数值索引容易混淆(如ENUM(‘a’,‘b’)中,where status=1匹配 ‘a’,where status=‘1’匹配值为 ‘1’ 的选项)。
日期与时间类型
MySQL 8.0 优化了日期类型的存储,核心用于存储时间数据,优先推荐DATETIME。
| 类型 | 字节数 | 格式 | 取值范围 | 核心特性 | 适用场景 |
|---|---|---|---|---|---|
| DATE | 3 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 仅存日期,无时间 | 生日、入职日期、业务日期 |
| TIME | 3 | HH:MM | -838:59:59 ~ 838:59:59 | 仅存时间 / 时长,支持微秒精度(0-6 位) | 营业时间、时长统计、时分秒数据 |
| DATETIME(M) | 5 | YYYY-MM-DD HH:MM | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 不受时区影响,支持微秒精度,支持默认值 / 自动更新 | 【首选】创建时间、更新时间、业务发生时间 |
| TIMESTAMP(M) | 4 | YYYY-MM-DD HH:MM | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 受会话时区影响,自动转换时区,有 2038 年上限问题 | 跨时区业务、需要自动时区转换的场景 |
| YEAR | 1 | YYYY | 1901 ~ 2155 | 仅存年份,占用空间极小 | 出生年份、发行年份、统计年份 |
- 90% 以上场景优先使用DATETIME(3)(毫秒精度),无 2038 问题,不受时区干扰,MySQL 8.0 支持DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP,完全覆盖 TIMESTAMP 的功能。
- 禁止用字符串类型存储日期时间,会丧失日期函数、索引优化能力,且占用更多空间。
原生特殊类型
-
JSON 类型(MySQL 5.7+ 支持,8.0 大幅优化)
- 核心特性:原生 JSON 格式存储,自动校验 JSON 格式合法性,支持 JSON 专属函数、索引(通过生成列创建),比 TEXT 存 JSON 性能提升显著。
- 最大容量:等同于 LONGTEXT,最大约 4GB。
- 适用场景:动态扩展字段、不固定结构的配置数据、前端透传的结构化数据、多维度标签,避免频繁 ALTER TABLE 加字段。
- 示例:JSON类型字段,存储{“id”:1,“name”:“张三”,“tags”:[“VIP”,“新用户”]}
-
空间数据类型
- 用于存储地理空间数据,支持空间索引,适配 LBS、地图类业务,核心类型:
- POINT:点坐标(经纬度)
- LINESTRING:线、路径
- POLYGON:多边形、区域
- GEOMETRY:通用空间类型,可存储上述任意类型
关于数据类型选择的指南
- 主键选型:单表自增主键用INT UNSIGNED,超大规模 / 分布式表用BIGINT UNSIGNED,禁止用 VARCHAR 作为主键。
- 金额存储:强制用DECIMAL(M,D),绝对禁止 FLOAT/DOUBLE。
- 字符串选型:优先VARCHAR,固定长度用CHAR,字符集统一utf8mb4,短文本禁用 TEXT。
- 时间选型:优先DATETIME(3),非必要不用 TIMESTAMP,避免 2038 问题。
- 状态枚举:少量固定选项用TINYINT(代码映射枚举),固定不变的单选可用 ENUM,高并发场景优先 TINYINT。
- 动态字段:非结构化 / 动态扩展字段用JSON类型,替代传统的键值对表或多冗余字段。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
相关文章 智能推荐
1
数据库表操作
MySQL数据库 针对数据库与表的操作,即数据定义语言
2
数据库函数
MySQL数据库 数据库常用函数
3
数据库的增删改查
MySQL数据库 关于MySQL数据库的增删改查语句
4
数据库的安装和配置
MySQL数据库 主要介绍数据库的作用以及MySQL的选择安装和配置
5
多表查询
MySQL数据库 关于MySQL多表查询的相关语句
随机文章 随机推荐