mysql5 varchar 最大长度_MySQL中varchar()的最大长度 char(255)最大长度

MySQL的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532。

varchar()最大可设置为 65532 / 3 = 21844 (utf8)

char()最大是255个字符,不论什么编码

英文和数字的话两种都是一个字母是1个字节.

就中文汉字来说,utf8占3个字节,gbk占2个字节。varchar(n),这里的n代表n个字符。

mysql表中字段总长度可以有65535个字节,意思就是 如果一个表只有varchar(n)这么一个字段,而且是utf8的话,那么这个字段最大可以有65535个字节的长度,差不多n=65535/3的字符。

为什么说差不多。因为varchar在存储的时候,会另加一个字节来记录长度(如果列声明的长度超过255字节,则使用两个字节,刚好2的8次方是255,超过255就只能用2个字节16位来记录了)。

如果表中有个char(10)和varchar(n)的话,那么就就这样,n的最大值 = 65532 / 3 = 21488 (2万多汉字)

有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少?

先明白计算的一些规则限制

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)

5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

存储限制

需要额外地在长度列表上存放实际的字符长度:小于255为1个字节,大于255则要2个字节

编码限制

gbk:每个字符最多占用2个字节

utf8:每个字符最多占用3个字节

长度限制

MySQL定义行的长度不能超过65535,这个限制了列的数目,比如char(255) utf8

那么列的数目最多有65535/(255*3)=85,列的数目可以从这里得到依据

行长度计算公式如下:

row length = 1

+ (sum of column lengths)

+ (number of NULL columns + delete_flag + 7)/8

+ (number of variable-length columns)

对于MyISAM,需要额外1个位来记录值是否为NULL;对于InnoDB,没有区别

对于row_format为fixed,delete_flag为1;对于row_format=dynamic,delete_flag为0

根据这个公式,我们便能够解答开头N的最大值:(65535-1-2)/3

减1是因为实际存储从第2个字节开始

减2则因为要在列表长度存储实际字符长度

除3是因为utf8编码限制

再来一道:

create table t4(c int, c2 char(30), c3 varchar(N)) CHARSET=utf8mb4;

N的最大值:(65535-1-2-4-30*3)/3

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

减1和减2与上例相同;

减4的原因是int类型的c占4个字节;

减30*3的原因是char(30)占用90个字节,编码是utf8。

如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是varchar了

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

weixin_39554021

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值