news 2026/4/23 17:06:36

面试官:MySQL 空值字段应该保存 NULL 还是默认值?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试官:MySQL 空值字段应该保存 NULL 还是默认值?

使用 MySQL 数据库时,对于一个可以为空的字段,如果没有值,应该保存 NULL 还是给一个默认值呢?多数时候我们不太注意,有时候不赋值,直接保存 NULL,有时候赋值一个业务指定的默认值。今天来聊一聊这个话题。

1.行数据存储

MySQL 保存一行数据时,不仅仅会保存数据本身,还会保存数据相关的额外信息。InnoDB 存储引擎支持四种行格式,MySQL 5.7 版本之后,默认使用 Dynamic 行格式。看一下官网给出的 4 种格式说明:

行格式

紧凑的存储特性

增强的可变长度列存储

大索引键前缀支持

压缩支持

表空间类型支持

文件格式

REDUNDANT

No

No

No

No

system, file-per-table, general

Antelope or Barracuda

COMPACT

Yes

No

No

No

system, file-per-table, general

Antelope or Barracuda

DYNAMIC

Yes

Yes

Yes

No

system, file-per-table, general

Barracuda

COMPRESSED

Yes

Yes

Yes

Yes

file-per-table, general

Barracuda

DYNAMIC 和 COMPRESSED 这两种格式都是 COMPACT 的改进版,基本结构跟 COMPACT 类似,我们看一下 COMPACT 这种格式。如下图:

我们创建一张表:

CREATE TABLE`t_user` ( `id`bigint(20) NOTNULL AUTO_INCREMENT, `name`varchar(16) DEFAULTNULL, `email`varchar(32) DEFAULTNULL, `address`varchar(255) DEFAULTNULL, PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULTCHARSET=latin1;

插入 2 行数据,

数据行保存格式如下图:

变长字段宽度列表保存变长字段非空值长度。从上图可以看到,变长字段宽度列表存放的列宽度顺序和数据表中的列顺序相反,也就是说变长字段宽度列表逆序存放列宽度。

如果表中所有列都是 NOT NULL 并且具有固定长度,则没有变长字段宽度列表这个部分。

同样,NULL 值列表也是逆序保存,当该值是 NULL 时,用二进制 1 表记,否则就保存二进制 0。

如果表中所有列都是 NOT NULL,就没有 NULL 值列表这个部分。

记录头信息用 5 个字节保存,主要记录数据的一些信息,比如:

  • delete-flag:记录是否删除,我们知道,在 MySQL 中删除一条数据,并不会马上从磁盘上删除,而是打上删除标记,在空余时间再进行异步清理。

  • record_type:记录类型,比如普通记录、非叶子节点记录。

  • next_record:指向下一条记录的地址指针。

  • n_owned:记录该组数据的条数。

隐藏列:

  • DB_TRX_ID:修改(插入、更新或删除)这一条数据的事务 id;

  • DB_ROLL_PTR:回滚指针,指向修改前的历史版本,用于回滚操作;

  • DB_ROW_ID:当表中不定义主键时用作主键来自动生成聚簇索引。

2.NULL 处理

根据上面的分析和实际使用,如果我们把一个字段直接定义成 NOT NULL,有下面好处:

  • 节省存储空间:NULL 值虽然不会占用数据存储空间,但是需要额外 1~2 个字节保存 NULL 值列表。

  • 减少应用程序 NullPointerException 的可能性;

  • 减少统计问题:比如 count(字段)不会统计 NULL 值。

  • 对索引有好处,索引是不会保存 NULL 值的,定义成 NULL 会使索引效率下降。

  • 比较操作:字段定义成 NULL,只能使用 is null 和 is not null 进行判断,不能使用比较操作比如 =、!=、>、<(都会返回 null) 。

  • 范围操作:字段定义成 NULL,使用 in、not in 语句时会返回空结果。

当然,设置为 NULL,并不是没有好处,比如:

  • 语义清晰‌:NULL 表示“无值”或“未知”,这在逻辑上更清晰准确;

  • 灵活性‌:NULL 值更容易筛选,比如在 WHERE 子句中使用 is null 进行筛选;

  • 兼容性‌:类似 JOIN 操作,NULL 跟任何值比较都会返回 NULL,这有助于保持数据的一致性和完整性。

在实际项目开发中,我们经常会在值是 NULL 的情况下给一个默认值,比如”-“、”“、”N/A“等,这一定程度上避免了空指针,但是往往带来一些额外的问题,比如上下游系统因为默认值的不一致导致业务处理受影响。

在表设计时,我们其实没有必要过多地考虑定义成 NULL 或默认值在存储空间上的影响,更多的应该考虑系统整体设计规范、保证各子系统在设计上的一致性,这样才能让处理逻辑更加健壮。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:12:24

德卡读卡器SDK 1.5:如何快速查询T10D8D3T60设备版本号?

德卡读卡器SDK 1.5&#xff1a;如何快速查询T10&D8&D3&T60设备版本号&#xff1f; 【免费下载链接】德卡读卡器SDK下载 本仓库提供德卡读卡器T10、D8、D3和T60系列的最新SDK&#xff08;版本1.5&#xff09;下载。该SDK包含最新的DEMO程序&#xff0c;用户可以通过…

作者头像 李华
网站建设 2026/4/23 11:12:30

酒店 RWA 模式深度拆解:资产轻量化与投资普惠化的双重突破路径

酒店行业长久以来面临“重资产、慢回流、高门槛”三大难题&#xff0c;让不少从业者步履维艰。 近日&#xff0c;一种被称为“酒店RWA”的模式逐渐进入公众视野&#xff0c;其“消费即投资”的核心理念&#xff0c;引发行业广泛关注与讨论。 今天&#xff0c;我们就来深入解读这…

作者头像 李华
网站建设 2026/4/23 11:11:35

5大关键点:深度解析IEC 61158-6工业总线标准

5大关键点&#xff1a;深度解析IEC 61158-6工业总线标准 【免费下载链接】IEC61158-6工业控制总线标准PDF下载分享 IEC 61158-6工业控制总线标准PDF下载 项目地址: https://gitcode.com/Open-source-documentation-tutorial/11472 在工业自动化系统设计中&#xff0c;你…

作者头像 李华
网站建设 2026/4/23 11:12:34

SmoothScroll 终极指南:让网页滚动体验丝滑流畅

SmoothScroll 终极指南&#xff1a;让网页滚动体验丝滑流畅 【免费下载链接】smoothscroll Scroll Behavior polyfill 项目地址: https://gitcode.com/gh_mirrors/smo/smoothscroll 在现代网页设计中&#xff0c;流畅的滚动体验已成为提升用户满意度的关键因素。你是否曾…

作者头像 李华
网站建设 2026/4/23 10:42:45

终极指南!私有AI知识库搭建(DeepSeek+Ollama+MaxKB),看这篇彻底告别付费API!

近日&#xff0c;由国家高新区人工智能产业协同创新网络、中央广播电视总台《赢在AI》节目组、清华大学可持续社会价值研究院、中国人民大学交叉科学研究院、赛迪研究院人工智能研究中心、中关村发展集团等联合主办的2025人工智能大会在北京中关村国际创新中心&中关村国家自…

作者头像 李华
网站建设 2026/4/23 11:12:17

Librum电子书管理神器:告别杂乱,开启智能阅读新时代

Librum电子书管理神器&#xff1a;告别杂乱&#xff0c;开启智能阅读新时代 【免费下载链接】Librum The Librum client application 项目地址: https://gitcode.com/GitHub_Trending/li/Librum 你是否曾经面对满屏的PDF文件无从下手&#xff1f;或者在不同设备间同步阅…

作者头像 李华