行溢出数据

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 持续学习,不断总结,共同进步,活到老学到老
  • 人生的本质是追寻自我的提升,包括思想、能力、意志等等。
  • 直面变化,找到背后更基础的东西,更基础的东西是用户的需求。
  • 我们的成功是我们的现在和将来决定的。今天和明天已经由昨天决定,你还可以决定后天。

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

在 MySQL 中一行除了 blob 及 text 类的大字段之外,其余字段的长度之和不能超过 65535,最大支持 65535 字节,实际执行会报错,实际支持 65532 字节.使用 latin1 字符集时是 65532 字节,使用 utf8 编码时,utf8 编码占 3 位,最大支持 21844 字节.

mysql 理论支持的Row Size Limit 是 65535 为什么实际是 65532

这是因为 MySQL 需要额外的字节来存储一些内部数据,例如行格式信息和 NULL 位图。

具体来说,每个行都需要几个字节来存储行格式信息和 NULL 位图。行格式信息用于指示行的格式,例如是否使用动态行格式或静态行格式。NULL 位图用于表示行中哪些列具有 NULL 值。这些额外的字节会占用行的空间,从而减少了实际可用的行大小。NULL 位图占一个字节

任何存储引擎都不能超过65535

mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
       c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
       f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

非空可以创建成功:

CREATE TABLE t2
       (c1 VARCHAR(65533) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;

可以为空的场景:

CREATE TABLE t2222
       (c1 VARCHAR(65532) DEFAULT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;

65535 是指所有 varchar 列的总和,不是单个 varchar 的字节数量

一个页为 16kb,为 16384 字节,如何存储 65535 字节的呢?

但是当发生行溢出时,数据存放在项类型为 Uncompress BLOB 页中。

# 执行报错
CREATE TABLE tmp_max_length_one_field
(
  a VARCHAR(65535)
) CHARSET = latin1
  ENGINE = InnoDB;

# 可以执行
CREATE TABLE tmp_max_length_one_field
(
  a VARCHAR(65532)
) CHARSET = latin1
  ENGINE = InnoDB;
 # 报错
  CREATE TABLE tmp_max_length_mut_field
(
  a VARCHAR(22222),
  b VARCHAR(22222),
  c VARCHAR(22222),
  d VARCHAR(22222)
) CHARSET = latin1
  ENGINE = InnoDB;

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值