MySQL中varchar(M)存储字符串过长

最近写项目,数据库报了一个错,错误原因是MySQL中存储的字符串过长

最近在学MySQL的基础,刚好学到了关于varchar类型

要存储的字符串是 “<p>12121212121212</p>\n<p><img src=\"https://zzjzzjzzjbucket.oss-cn-hangzhou.aliyuncs.com/exampledir/uploads/2023-03-03/mceu_98752142411677814514873.jpg\" width=\"838\" height=\"838\" /></p>\n<p>1212121212</p>” , 数据库是varchar(191) ,然后查看一下数据库的字符集

对于utf8mb4来说,存储一个字符需要1-4个字节

我们先来第一次尝试

MySQL对一条记录占用的最大存储空间是有限制的,除了BLOB或者TEXT类型的列之外,其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节

varchar最多存储65535个字节,然后我们改为65535,不出意外就报错了,原因是:

这个65535个字节除了列本身的数据之外,还包括一些其他的数据(storage overhead),比如说我们为了存储一个VARCHAR(M)类型的列,其实需要占用3部分存储空间:

  • 真实数据

  • 真实数据占用字节的长度 (使用两个字节)

  • NULL值标识,如果该列有NOT NULL属性则可以没有这部分存储空间 (使用一个字节)

我们去掉三个字节,65535-3 = 65532

其实上面也有提示信息,提示最大只能写16383,但是这个16383是怎么来的呢?

如果VARCHAR(M)类型的列使用的不是ascii字符集,那M的最大取值取决于该字符集表示一个字符最多需要的字节数。在列的值允许为NULL的情况下,gbk字符集表示一个字符最多需要2个字节,那在该字符集下,M的最大取值就是32766(也就是:65532/2),也就是说最多能存储32766个字符;utf8字符集表示一个字符最多需要3个字节,那在该字符集下,M的最大取值就是21844,就是说最多能存储21844(也就是:65532/3)个字符。 我们使用的utf8mb4,所以是65532/4

果然如此!

正愁学习了MySQL的基础底层知识但是无处使用,现在就遇到了一个实际问题。

但是修改之后,还是报错了

该问题暂时不清楚是咋回事,看了几篇博客,也没有看懂,暂时先搁置一下,后面再说,直接改成了10000,然后就成功了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值