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

来源:互联网 发布:软件防蓝光 知乎 编辑:程序博客网 时间:2024/05/16 17:20
DBD::mysql::st execute failed: Column length too big for column 'rooms_keyid      ' (max = 21845); use BLOB or TEXT instead at createalltable.pl line 137.
ERROR::create table IF NOT EXISTS `rooms_get`( `rooms_id` int NOT NULL ,                 
 `rooms_keyid` varchar(65535) NOT NULL ,
 `baseinfo_keyid` varchar(65535),
batchinfo_keyid` varchar(65535),
building_id` varchar(65535),
 `roomType` varchar(400));::DBI::db=HASH(0xd0fa60)->errstr at createalltable.pl                  line 137.
okokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokok                 okokokokokokokokokokokokokokokokokokokokokokokokokokok[root@t perl-scripts]# per                 l createdatabase.pl

create database `stucourse` successfully!


[root@t perl-scripts]# perl createalltable.pl


DBD::mysql::st execute failed: Row size too large. The maximum row size for the                  used table type, not counting BLOBs, is 65535. This includes storage overhead, c                 heck the manual. You have to change some columns to TEXT or BLOBs at createallta                 ble.pl line 137.
ERROR::create table IF NOT EXISTS `rooms_get`( `rooms_id` int NOT NULL ,                 
 `rooms_keyid` varchar(21845) NOT NULL ,
 `baseinfo_keyid` varchar(21845),
 `batchinfo_keyid` varchar(21845),
 `building_id` varchar(21845),

 `roomType` varchar(400));::DBI::db=HASH(0x109da60)->errstr at createalltable.pl                  line 137.



用21845和65535 都不行。


那么create table的时候 varchar的长度到底怎么样定义,varchar的最大长度是多少。首先我们要了解几个基本内容:



1. varchar存储规则:

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 
Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同。 


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



原创粉丝点击