mysql varchar 的最大长度

mycolumn varchar(M),这里的M是字符个数还是字节个数,M的最大是多少?

首先,这个官方文档截图,回答了所有问题


下面,中文解释下

先说结论:
1. M 是字符的个数
2. M 的最大值 取决于 行字节数(这是个常量值,即65535)以及 建表时的charset

详细是这样的:
mysql中,任何一个表中,行字节数(即,所有column字节长度的和)必须 <=65535;
M的最大值,就是 (65535-prefixlength)/chaset中每个字符的字节数;
prefixlength的长度,会变的,取决于 我们存入的字符的个数(<=255时,prefixlength=1; >255时,prefixlength=2);
不过,既然我们在说 M的最大值,我们就认为存入的字符个数肯定>255,所以,prefixlength总是==2

所以,M的长度就是:(65535-2)/chaset中每个字符的字节数


例如:
gbk时,每个字符 包含2个字节,所以,charset='gbk'时,varchar的最大长度是
(65535-2)/2=32766.5,即,varchar最大长度是 32766

drop table if exists t_32766;
-- 失败,因为长度 32767 超了
create table t_32766(v varchar(32767) not null default '') engine=InnoDB charset='gbk';
-- 成功
create table t_32766(v varchar(32766) not null default '') engine=InnoDB charset='gbk';


utf8时,每个字符 包含3个字节,所以,charset='utf8'时,varchar的最大长度是

(65535-2)/3=21844.33333333,即,varchar最大长度是 21844

drop table if exists t_21844;
-- 失败,因为长度 21845 超了
create table t_21844(v varchar(21845) not null default '') engine=InnoDB charset='utf8';
-- 成功
create table t_21844(v varchar(21844) not null default '') engine=InnoDB charset='utf8';


另外:

1. utf8存储时,可以用1到6个字节来存储的。即a, b, c用一个字节存储;中文3个字节;还有些特殊的是6个字节,不过,mysql总是用3个字节(估计是因为3字节以上的utf8用的很少把。猜的)

2. 我的mysql版本是:MySQL Community Server (GPL) 5.6.23




阅读更多
上一篇不用想着把工作做到尽善尽美
下一篇每一个shard都需要有个家
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭