ITPub博客

首页 > 数据库 > MySQL > 关于varchar长度的测试---mysql

关于varchar长度的测试---mysql

MySQL 作者:gy860816 时间:2014-03-06 13:55:05 0 删除 编辑

《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。可以通过下面的测试有个了解。

01 SHOW TABLE STATUS LIKE "test";
02 Row_format:Compact
03   
04 CREATE TABLE `test` (
05   `c1` VARCHAR(21844) COLLATE utf8_bin NOT NULL
06 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
07   
08 mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21844) NOT NULL;
09 Query OK, 7 ROWS affected (0.07 sec)
10 Records: 7  Duplicates: 0  Warnings: 0
11   
12 mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21845) NOT NULL;
13 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
14 mysql> SELECT 21844*3+2;
15 +-----------+
16 | 21844*3+2 |
17 +-----------+
18     65534 |
19 +-----------+
20 1 ROW IN SET (0.00 sec)

因为null标示位占用了一个字节,这个时候去掉not null就不可以了

1 mysql> ALTER TABLE test MODIFY COLUMN c1 VARCHAR(21843);          
2 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
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21411640/viewspace-1114551/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-04-17