MySQL 8.4 数据类型详解
MySQL 8.4 LTS 已经发布有一段时间了,很多项目都在准备推进升级。本期内容来带大家复盘一下 MySQL 8.4 中的数据类型。
01. 版本现状:8.4 LTS 数据类型
MySQL 8.4 作为首个长期支持版本(LTS),在数据类型层面延续了8.0的框架,但强化了严格模式(Strict Mode)的默认启用,这对数据迁移、版本升级至关重要。
| 维度 | MySQL 5.7(已EOL) | MySQL 8.0 | MySQL 8.4.6 LTS(推荐) |
|---|---|---|---|
| JSON支持 | 基础JSON | JSON增强 + 多值索引 | JSON Duality Views(技术预览) |
| 字符集 | utf8(utf8mb3) | utf8mb4 默认 | utf8mb4_0900_ai_ci 强制 |
| 数值精度 | FLOAT 建议 | DECIMAL 强化 | DECIMAL(65,30) 极限精度 |
| 时区处理 | TIMESTAMP 转化 | 显式时区 | 与OCI云服务时区同步优化 |
| AI向量 | 不支持 | 不支持 | 9.0 预览 / 8.4 建议 JSON 中转 |
例如,MySQL 8.4 默认启用了STRICT_TRANS_TABLES和ONLY_FULL_GROUP_BY,这意味着向 UNSIGNED 字段插入负数的操作,在8.4中默认会报错而非仅警告。
1 | mysql> select version()\G |
02. 数值类型:DECIMAL的精度问题与FLOAT陷阱
很多同学误以为 DECIMAL与FLOAT/DOUBLE都差不多,可以互换使用。存储金额或AI模型参数时,习惯性地使用FLOAT,但这在金融系统中应该是绝对禁止的。
来看具体例子:
1 | -- 场景:存储以下值,哪个类型不会丢失精度? |
输出结果,表 financial_data 精确显示 12325.12517173 ,而 bad_precision 中的 FLOAT 类型会显示为 12325.13:
1 | mysql> SELECT * FROM bad_precision; |
03. 日期时间:TIMESTAMP的时区陷阱与DATETIME的AI应用
MySQL 8.4在OCI云环境下默认使用UTC时区存储,但国内一般On-Premises服务器通常设置为CST(China Standard Time),这会导致TIMESTAMP类型出现8小时偏差。
1 | -- 优化会议表的时间存储。start_time用DATETIME,duration用TIME |
时间数据类型上的索引。
示例:高效查询2000年出生的用户(索引优化)
1 | -- 创建测试表 |
错误写法:WHERE YEAR(date_of_birth) = 2000(无法使用索引)
1 | mysql> EXPLAIN ANALYZE |
正确写法:范围查询(利用索引)
1 | mysql> EXPLAIN ANALYZE |
04. JSON类型:从文档存储到AI元数据管理
虽然原生VECTOR类型在MySQL 9.0才引入,但8.4的JSON类型通过虚拟列(Generated Columns)已经可以高效存储AI应用的半结构化元数据。
1 | -- 创建带JSON校验的表(数据完整性约束) |
直接查询JSON字段会失败(需要 JSON_UNQUOTE ),MySQL 8.4 推荐方案是创建虚拟列并建立索引。
1 | ALTER TABLE fshop |
现在可以直接查询,且走索引。
1 | mysql> EXPLAIN ANALYZE |
JSON路径查询(-> vs ->>的区别)
1 | SELECT |
输出结果:
1 | +-------------+---------------+--------+ |
AI应用实践:在OCI的HeatWave Lakehouse中,MySQL 8.4的JSON列可以直接被AI算法读取为特征向量,无需ETL转换。建议在本地环境中为JSON列设置COLUMN_FORMAT COMPRESSED,可节省40%存储空间。
1 | CREATE TABLE employees ( |
05. 字符类型:utf8mb4与转义符处理
特殊字符的插入也需要特别注意,特别是姓名中的单引号(如O’Hara)。MySQL 8.4默认使用utf8mb4字符集,支持emoji和中文生僻字。
1 | 插入带单引号的姓名(两种正确方式) |
06. 生产警示:SQL Mode与隐式类型转换
MySQL 8.4的严格模式设置是数据迁移最容易踩坑的地方。下面展示了在非严格模式下,向UNSIGNED字段插入负数的诡异行为。
1 | -- sql_mode=''(空模式)下的陷阱。 8.4中已不建议,但部分遗留系统仍使用 |
CONCAT与NULL的陷阱
1 | mysql> SELECT CONCAT('Hello ', NULL, 'World!'); |
返回NULL(不是"Hello World!"),这在AI文本拼接中经常导致意外空值。
MySQL 8.4 生产环境推荐配置(/etc/my.cnf)
1 | [mysqld] |
使用COALESCE避免NULL(生产最佳实践),可以正确返回 Hello World!
1 | mysql> SELECT CONCAT('Hello ', COALESCE(NULL, ''), 'World!'); -- Hello World! |
总结
本文干货较多,这里总结一下几条重点。
- 金融与AI模型参数:坚决使用DECIMAL而非FLOAT/DOUBLE,精度损失在AI累加计算中会被放大
- 时区敏感业务:8.4中优先使用DATETIME(3)存储毫秒级时间戳,TIMESTAMP仅用于自动更新的created_at字段,避免OCI跨Region时区混乱
- AI元数据存储:利用JSON类型+虚拟列+索引的组合,在8.4中实现准向量检索能力,为9.0的VECTOR升级预留空间
- 字符集:强制使用utf8mb4_0900_ai_ci,禁用已废弃的utf8mb3,确保使用中文的操作系统上的生僻字与emoji支持
- 严格模式:生产环境必须启用
STRICT_TRANS_TABLES,杜绝隐式截断,宁可报错不可错存
Have a nice day ~ ☕
🌻 近期内容 ▼
- Oracle Skills开源:AI工程正在进入"技能时代"
- 苦等三年!Oracle AI Database 26ai本地服务器版终于来了
- MySQL 8.0结束生命周期,8.4.9 LTS、9.7.0发版上线:一个时代的交接与新生
👉 这里有得聊
如果对国产基础软件(操作系统、数据库、中间件)、AI、Vibe Coding、OpenClaw 、Hermes Agent 等感兴趣,可以加群一起聊聊。关注微信公众号:(少安事务所),后台回复[群],即可看到入口。如果这篇文章为你带来了灵感或启发,请帮忙『点赞、推荐、转发』吧,感谢!ღ( ´・ᴗ・` )~
Author: Shawn Yan
Link: https://shawnyan.cn/2025/mysql/mysql-8-4-0-data-type-details/index.html
License: All articles on this site are original unless otherwise stated. Please indicate the source when reprinting!