关于 mysql varchar 字段的长度_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2090 | 回复: 0   主题: 关于 mysql varchar 字段的长度        下一篇 
wayne
注册用户
等级:中校
经验:1690
发帖:221
精华:0
注册:2011-7-21
状态:离线
发送短消息息给wayne 加好友    发送短消息息给wayne 发消息
发表于: IP:您无权察看 2014-11-12 17:19:21 | [全部帖] [楼主帖] 楼主

本文是对row_format为compact时,varchar长度的一个探讨。
《MySQL技术内幕 InnoDB存储引擎》中姜承尧提到MySQL varchar最大长度65535是指所有的varchar长度累加必须小于65535,这篇文章对这个进行一个探讨,发现65535中应该包含了所有字段的长度、变长字段长度标示位、NULL标示位的累计。在此感谢姜承尧的《MySQL技术内幕 InnoDB存储引擎》,对很多东西有了一个更清晰的了解。

注:下面的测试是

 character_set=utf8


utf8下面一个字符占3个字节,因此最大是65535/3=21845,但是21845之后没有地方存储长度信息,所以单列的最大长度是21844

Every table (regardless of storage engine) has a maximum row size of 65,535 bytes。可以通过下面的测试有个了解。

SHOW TABLE STATUS LIKE "test";
Row_format:Compact
CREATE TABLE `test` (
`c1` VARCHAR(21844) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21844) NOT NULL;
Query OK, 7 ROWS affected (0.07 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21845) NOT NULL;
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
mysql> SELECT 21844*3+2;
+-----------+
| 21844*3+2 |
+-----------+
| 65534 |
+-----------+
1 ROW IN SET (0.00 sec)


因为null标示位占用了一个字节,所以可以去掉not null限制。

mysql> ALTER TABLE test MODIFY c1 VARCHAR(21844) COLLATE utf8_bin;
Query OK, 7 ROWS affected (0.08 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE test ADD COLUMN i1 INT NOT NULL;
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
mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21843) NOT NULL;
Query OK, 7 ROWS affected (0.08 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE test ADD COLUMN i1 INT NOT NULL;
Query OK, 7 ROWS affected (0.08 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE test ADD COLUMN i2 INT NOT NULL;
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
mysql> SELECT 21843*3+2+4;
+-------------+
| 21843*3+2+4 |
+-------------+
| 65535 |
+-------------+
1 ROW IN SET (0.00 sec)


这个时候去掉not null就不可以了

mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21843);
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


参照如下:

 1,http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html


2,MySQL技术内幕 InnoDB存储引擎

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论