加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MySQL varchar字段长度限制说明

(2014-09-10 16:53:01)
标签:

mysql

varchar

分类: MYSQL
脑补,varchar(N),N指的是最大字符数,不是字节数。
先上测试说明:

eg1:
mysql> CREATE TABLE test (

   ->       recordid varchar(32) NOT NULL,
   ->      a1 varchar(10000) DEFAULT NULL,
   ->     a2 varchar(10000) DEFAULT NULL,
   ->     a3 varchar(10000) DEFAULT NULL,
   ->     primary KEY (recordid)
   ->      ) ENGINE=INNODB DEFAULT CHARSET=utf8;
ERROR 1118 (42000): 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

eg2: 
mysql> CREATE TABLE test (

   ->       recordid varchar(32) NOT NULL,
   ->      a1 varchar(30000) DEFAULT NULL,
   ->     a2 varchar(30000) DEFAULT NULL,
   ->     a3 varchar(30000) DEFAULT NULL,
   ->     primary KEY (recordid)
   ->      ) ENGINE=INNODB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 3 warnings (0.07 sec)

mysql> show warnings;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'a1' from VARCHAR to TEXT |
| Note  | 1246 | Converting column 'a2' from VARCHAR to TEXT |
| Note  | 1246 | Converting column 'a3' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
3 rows in set (0.00 sec)

mysql> show create table test; 

+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                         |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_test | CREATE TABLE `test` (
 `recordid` varchar(32) NOT NULL,
 `a1` mediumtext,
 `a2` mediumtext,
 `a3` mediumtext,
 PRIMARY KEY (`recordid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
官网手册内容:
Every table (regardless of storage engine) has a maximum row size of 65,535 bytes. Storage engines may place additional constraints on this limit, reducing the effective maximum row size
1:单行最大限制为65535字节,这里是不包括大字段 text blob
2:单个字段如果大于65535,则会直接转成 mediumtext,会在建表的时候出现warnings 提示
解释上面的问题:
eg1:
单个字段长度 : varchar(10000), 字节数:10000* 3(utf83个字节,gbk 2个字节) + (1 or 2 ) =30000 ,小于655535
单行ROW记录长度: varchar(10000) *3 , 单个字段长度*3 =90000 ,大于65535,所以不能成功建表,报错

eg2:
 
单个字段长度 : varchar(30000), 字节数:10000* 3(utf83个字节,gbk 2个字节) + (1 or 2 ) =90000 ,大于655535 ,所以字段类型转换成mediumtext,但是会出现warnings;
单行ROW记录长度: 因为字段类型已经是mediumtext,不存在65535字节限制。所以可以成功建表。
参考链接:
1:http://dev.mysql.com/doc/refman/5.1/en/column-count-limit.html
2:http://dev.mysql.com/doc/refman/5.1/en/silent-column-changes.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有