MySQL中varchar()的最大长度 char(255)最大长度
- 10323
- MySQL
- 0
- super_dodo
- 2016/09/06
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了
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例