mysql column legnth too big for_遇到的问题----Column length too big for column

2、限制规则

字段的限制在字段定义的时候有以下规则:

a)存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b)编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

对于英文比较多的论坛,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c)表长度限制

mysql的一个表的总共字段长度不超过65535。

那么我们怎么来计算的,现在我用的mysql5.6.14版本 所以 它的varchar(n) 中的n是字符的意思。 然后 环境的字符集设置为utf-8。

因为每个表的字段总长度只能是65535字节.   每个utf-8字符占用3个字节,那么 我们的字符长度可以有   65535/3=21845个字符。

也就是说 我们每个表的 varchar(n)  n加起来只能是21845。

但是 每个字段都要用一个控制字符或者说是身份字符。

所以我们创建一个字段的时候  它的最大长度 是21845-1=21844.

我们可以用下面的创建语句来验证:

CREATE TABLE `t` (

`var` varchar(21845) default NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

执行有错误

用21844时则正常。

CREATE TABLE `t` (

`var` varchar(21844) default NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

可以正常的执行。

如果我们要增加一个varchar字段呢    一共两个字段就有2个控制字符。 21845-2=21843

CREATE TABLE `t` (`var` varchar(10922) default NULL ,`var2` varchar(10922) )      和为21844时出错。

CREATE TABLE `t` (`var` varchar(10921) default NULL ,`var2` varchar(10922) )     正常。

参考资料:

http://cau99.blog.51cto.com/1855224/383023

http://blog.csdn.net/guoxiaoqian8028/article/details/8736879

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值