首先我们要知道,存储的最大长度没一个固定的数值,根据不同的表结构设计有所不同,一般有以下几个限制规则:
实例一:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少?
如:create table tb_name1(a varchar(N)) default charset=utf8;
-
减1的原因是实际行存储从第二个字节开始(这个必须减,你懂得.....不懂可以去撞墙^o^....);
-
减2的原因是varchar头部的2个字节表示长度;
-
除3的原因是字符编码是utf8.
Query OK, 0 rows affected (0.38 sec)
MariaDB [opdba]> drop table tb_name1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [opdba]> create table tb_name1(a varchar(21845)) 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
实例二:若一张表中有一个字段VARCHAR(N)类型,并且有其它的字段类型,utf8编码,则N的最大值为多少?
如:create table tb_name2(a int, b char(20), c varchar(N)) default charset=utf8;
-
减1的原因是实际行存储从第二个字节开始;
-
减2的原因是varchar头部的2个字节表示长度;
-
减4的原因是a字段的int类型占4个字节;
-
减20*3的原因是char(20)占用60个字节,编码是utf8。
Query OK, 0 rows affected (0.28 sec)
MariaDB [opdba]> drop table tb_name2;
Query OK, 0 rows affected (0.20 sec)
MariaDB [opdba]> create table tb_name2(a int, b char(20), c varchar(21823)) 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
实例三:若一张表中有多字段VARCHAR(N)类型,并且有其它的字段类型,gbk编码,则N的最大值为多少?
如:create table tb_name3(a int, b char(20), c varchar(50), d varchar(N)) default charset=gbk;
-
第一个减1的原因是实际行存储从第二个字节开始;
-
第二个减1表示第二个varchar(50)头部一个1个字节表示长度(小于255);
-
减2的原因是varchar头部的2个字节表示长度;
-
减20*2的原因是char(20)占用40个字节,编码是gbk;
-
减50*2的原因是varchar(50)占用100个字节,编码是gbk;
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
MariaDB [opdba]> create table tb_name3(a int, b char(20), c varchar(50), d varchar(32693)) default charset=gbk;
本系列文章同步到:http://www.opdba.com/?p=303
转载于:https://blog.51cto.com/opsmysql/1343771