一道varchar(N)计算的问题

如题,mysql5以上环境,计算c5 VARCHAR (N) 中N的可用最大值

DROP TABLE IF EXISTS t;

CREATE TABLE t (
c1 INT,
c2 CHAR (30),
c3 VARCHAR (10906) ,
c4 VARCHAR (5453) ,
c5 VARCHAR (N) 
) charset = utf8;


计算方法:

(65535-1-2x3-4-30x3)/3=21812

21812-10906-5453=5452.333~=5452

说明:
  • utf8字符占三字节
  • (65535[所有字段总的字节数]-1[null 标示位,从第二字节开始存储]-2[超过255需要两个字节表示长度这就是为什么通常设置为varchar(255)]x3[三个varchar字段]-4[c1 int占4字节]-30x3[c2 指定char30个字符])/3=21812[三个varchar字段总的可用字符数]
  • 21812[三个varchar字段总的可用字符数]-10906[c3字符数]-5453[c4字符数]=5452.333[c5可用字符数]

补充内容:
  • MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255
  • MySQL要求一个行的定义长度不能超过65535 是指所有列的长度总和不能超过65535.如果列的长度总和超过这个长度,依然无法创建.
  • 因为null标示位占用了一个字节,所以可以去掉not null限制

例子一:
// 失败
CREATE TABLE t (
a VARCHAR(65533)
) charset = latin1;
// 成功
CREATE TABLE t (
a VARCHAR(65533) NOT NULL
) charset = latin1;

例子二:
(65535-2x3)/3===21843
// 失败
CREATE TABLE t (
c1 VARCHAR (10000) NOT NULL,
c2 VARCHAR (10000) NOT NULL,
c3 VARCHAR (1843)
) charset = utf8;
// 成功
CREATE TABLE t (
c1 VARCHAR (10000) NOT NULL,
c2 VARCHAR (10000) NOT NULL,
c3 VARCHAR (1843) NOT NULL
) charset = utf8;


  • 非严格模式下,若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
2015-08-18 15:07 添加评论 分享
已邀请:

要回复问题请先登录注册

退出全屏模式 全屏模式 回复