遇到的问题----Column length too big for column
来源:互联网 发布:软件防蓝光 知乎 编辑:程序博客网 时间:2024/05/16 17:20
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
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
- 遇到的问题----Column length too big for column
- ERROR 1074 (42000): Column length too big for column 'Flist' (max = 21845); use BLOB or TEXT instead
- MySQL ERROR 1074 (42000): Column length too big for column 'Flist' (max = 21845); use BLOB or TEXT i
- Confluence迁移中遇到的问题(Data too long for column 'STRINGVAL')及解决方法
- mysql中data too long for column问题的解决方法
- mysql中data too long for column问题的解决方法
- mysql中data too long for column问题的解决方法
- data too long for column 问题
- data too long for column的解决方法
- Date too long for column.
- Data too long for column
- (汉字问题1)mysql中data too long for column问题的解决方法
- [Err] 1406 - Data too long for column 问题
- 关于MySql5“data too long for column”问题的探解
- 解决数据库 data too long for column 'name' at row 1的问题
- MYSQL中出现data too long for column的解决方案
- data too long for column 解决方案
- 解决data too long for column”错误
- 编译器错误C2011类型重定义小记
- Spring+Logback 整合的项目
- 2013.11.08
- 如何输出全排列
- 多维数组存储的两种方式
- 遇到的问题----Column length too big for column
- 333333333333333333333333333333
- 如何使用百度云环境部署java版微信平台
- asp.net关于在线支付的实现过程
- socket通信简介
- socket阻塞与非阻塞,同步与异步
- 一个女程序员第九年工作总结
- linux下用i2c-tools读写i2c器件的问题
- jquery 选择器的介绍