最近写项目,数据库报了一个错,错误原因是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的基础底层知识但是无处使用,现在就遇到了一个实际问题。