技术分享 | MySQL 字段长度限制的计算方法

本文将对MySQL的两个限制进行补充说明:1. MySQL Server层限制单条记录大小不超过65535字节;2. InnoDB层限制不能超过innodb_page_size的一半,以默认16K设置为例,限制为8126。下文内容基于MySQL 5.7.27进行说明。二、Server层限制的计算方法 2.1 计算过程 若MySQL Server层面限制,则会返回特定报错信息...
技术分享 | MySQL 字段长度限制的计算方法
本文由kay撰写,擅长Oracle、MySQL、PostgresSQL等领域,专注于Oracle和MySQL性能优化、数据库架构设计、故障修复、数据迁移和恢复,热衷于研究MySQL内核源码,并拥有Oracle OCP认证。目前在江苏国泰新点软件有限公司担任DBA技术团队成员。

一、MySQL限制回顾

之前在《MySQL Text字段的限制》一文中提及了MySQL在Server层和InnoDB层的限制,但未详细阐述限制计算方法。本文将对MySQL的两个限制进行补充说明:1. MySQL Server层限制单条记录大小不超过65535字节;2. InnoDB层限制不能超过innodb_page_size的一半,以默认16K设置为例,限制为8126。下文内容基于MySQL 5.7.27进行说明。

二、Server层限制的计算方法

2.1 计算过程

若MySQL Server层面限制,则会返回特定报错信息。关键代码路径在于`pack_header`中,具体在于判断`reclength`值是否大于65535。因此,了解`reclength`的计算过程至关重要。

2.2 小结

根据上述计算方式,MySQL Server层计算长度的公式为:`total_length <= 65535`。满足此条件即可通过MySQL Server层的检查。

三、InnoDB层限制的计算方法

3.1 计算过程

InnoDB层面限制的报错信息中,关键代码路径在于判断`page_rec_max`值。根据源码定义,`srv_page_size`默认值为1<<14即16384,配置也是16384。而`UNIV_PAGE_SIZE_MAX`值为1<<16即65536。因此,`srv_page_size`不等于`UNIV_PAGE_SIZE_MAX`。计算`page_rec_max`值为`page_get_free_space_of_empty(comp) / 2`。进一步分析,一条记录实际长度(`rec_max_size`)的计算公式如下。

3.2 小结

在InnoDB层计算长度的公式为:`rec_max_size < 8126`。满足此条件即可通过InnoDB层的检查。

四、总结

1. 必须同时满足MySQL Server层和InnoDB层的限制条件,才能成功创建表。

2. 遇到上述报错情况时,多数原因在于varchar等字段设置过大。建议对字段逐步缩小或使用text替代。2024-10-03
mengvlog 阅读 8 次 更新于 2025-07-20 20:32:46 我来答关注问题0
檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部