MySQL中varchar最⼤长度是多少?
⼀. varchar存储规则:
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,⽆论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最⼤⼤⼩是65532字节
Mysql4中最⼤也不过是20个字节,但是Mysql5根据编码不同,存储⼤⼩也不同。varchar2最大长度
⼆. varchar和char 的区别:
char是⼀种固定长度的类型,varchar则是⼀种可变长度的类型,它们的区别是: char(M)类型的数据列⾥,每个值都占⽤M个字节,如果某个长度⼩于M,MySQL就会在它的右边⽤空格字符补⾜.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列⾥,每个值只占⽤刚好够⽤的字节再加上⼀个⽤来记录其长度的字节(即总长度为L+1字节).
在MySQL中⽤来判断是否需要进⾏对据列类型转换的规则
1、在⼀个数据表⾥,如果每⼀个数据列的长度都是固定的,那么每⼀个数据⾏的长度也将是固定的.
2、只要数据表⾥有⼀个数据列的长度的可变的,那么各数据⾏的长度都是可变的.
3、如果某个数据表⾥的数据⾏的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表⾥的固定长度类型的数据列转换为相应的可变长度类型.例外:长度⼩于4个字符的char数据列不会被转换为varchar类型
被问到⼀个问题:MySQL中varchar最⼤长度是多少?这不是⼀个固定的数字。本⽂简要说明⼀下限制规则。
1、限制规则
字段的限制在字段定义的时候有以下规则:
a)                  存储限制
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头⽤1到2个字节表⽰实际长度(长度超过255时需要2个字节),因此最⼤长度不能超过65535。
b)                  编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最⼤长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最⼤长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强⾏转为text类型,并产⽣warning。
c)                  ⾏长度限制
导致实际应⽤中varchar长度限制的是⼀个⾏定义的长度。 MySQL要求⼀个⾏的定义长度不能超过65535。若定义的表长度超过这个值,则
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。
2、计算例⼦
举两个例说明⼀下实际长度的计算。
a)                  若⼀个表只有⼀个varchar类型,如定义为
create table t4(c varchar(N)) charset=gbk;
则此处N的最⼤值为(65535-1-2)/2= 32766。
减1的原因是实际⾏存储从第⼆个字节开始’;
减2的原因是varchar头部的2个字节表⽰长度;
除2的原因是字符编码是gbk。
b)                  若⼀个表定义为
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
则此处N的最⼤值为 (65535-1-2-4-30*3)/3=21812
减1和减2与上例相同;
减4的原因是int类型的c占4个字节;
减30*3的原因是char(30)占⽤90个字节,编码是utf8。
如果被varchar超过上述的b规则,被强转成text类型,则每个字段占⽤定义长度为11字节,当然这已经不是“varchar”了。
则此处N的最⼤值为 (65535-1-2-4-30*3)/3=21812
create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8
create table t5(c int, c2 varchar(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8
varchar(30)和char(30)最多能存放:
⼯在基⼯左基⼯在基顺⼯作奔⼤规模集成电路城⼯作东奔西⾛左夺⼯城鞯⾰城载模压地⼯魂牵梦萦栽⼟⽊⼯程魂牵梦萦栽植奇巧魂牵梦萦地厅城柑模压东奔西⾛苦村落模压⾰⾰柑可耕地村模压基栽魂牵梦基
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111
CREATE TABLE `t` (
`var` varchar(21844) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
可以正常的执⾏。
[SQL] 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
执⾏有错误
[MySQL]如何计算varchar最⼤长度
这⾥有⼀道我YY出来的关于MySQL的题:
表设计如下
id mediumint
name varchar
问题是:  MySQL5.1 ,  在GBK字符环境下,这⾥的varchar最长能设多长?
正确答案是: 32764
那如果表设计为两个 varchar,  第⼀个长度设为300时,第⼆个varchar应该多长?  --答案见本⽂最后⾯
要想搞明⽩是怎么算出来的,请仔细下⾯的解释:
官⽅⽂档上对 int 及 varchar 的说明如下:
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
看到这⾥,你以为上⾯的varchar长度是: 65535 /2=32767?
不对,因为官⽅⽂档后⾯⼜说:
In contrast to CHAR, VARCHAR values are stored as a one-byte or two-byte length prefix plus data. The length prefix indicates the number of bytes in the value.
很明⽩了,varchar会保留⼀⾄两个字节来存放长度信息,但到底是1Byte还是2Byte?
往后看:
A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require
more than 255 bytes.
你再来算⼀算varchar长度最⼤为: (65535-2) /2 = 32766 ?
还是不对!
其实每⼀⾏的总长度是有限制的,即最⼤为65535.
Every table has a maximum row size of 65,535 bytes.
This maximum applies to all storage engines, but a given engine might have additional constraints that result in a lower effective maximum row size.
所以算varchar得把id的扣除:
(65535-3-2) /2 = 32765 ?
测试⼀下:
root@saker 05:27:28>create table t4(id mediumint, name varchar(32765));
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
⽤32764测试⼀下:
root@saker 05:27:31>create table t4(id mediumint, name varchar(32764));
Query OK, 0 rows affected (0.16 sec)
root@saker 05:27:35>desc t4;
+-------+----------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id    | mediumint(9)  | YES  |    | NULL    |      |
| name  | varchar(32764) | YES  |    | NULL    |      |
+-------+----------------+------+-----+---------+-------+
这说明还保留了1⾄2个字节来留其它控制信息。(在⽂档⾥⾯我没有到说明,所以也不知道到底是1个还是2个byte)
但我想到了⼀个⽅法来反推出来,
我把id的类型从medium改成 int ,这时id的长度就从3变为4了,如果控制字节⽤了2Bytes,那varchar的长度还设为32764的话,显然是要报错的。。。
root@saker 05:29:14>create table t3(id int, name varchar(32764));
Query OK, 0 rows affected (0.18 sec)
root@saker 07:01:10>desc t3;
+-------+----------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id    | int(11)        | YES  |    | NULL    |      |
| name  | varchar(32764) | YES  |    | NULL    |      |
+-------+----------------+------+-----+---------+-------+
这样应该能说明,控制位只有1个字节。
下⾯⽤这个结论来计算第⼆个问题:
那如果表设计为两个 varchar,  第⼀个长度设为300时,第⼆个varchar应该多长?
(65535-1-2-2-300*2) /2 =  32465
测试⼀下:
root@saker 07:09:23>create table t1(id varchar(300), name varchar(32465));
Query OK, 0 rows affected (0.15 sec)
root@saker 07:09:26>desc t1;
+-------+----------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id    | varchar(300)  | YES  |    | NULL    |      |
| name  | varchar(32465) | YES  |    | NULL    |      |
+-------+----------------+------+-----+---------+-------+
多⼀位都不⾏:
root@saker 07:08:12>create table t1(id varchar(300), name varchar(32466));
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
最后把以上所有知识综合起来:
有⼀个表:
id int,  name1 char(20),  name2 varchar(100), name3 varchar(?)
算⼀下:
(65535-1-1-2-4-20*2-100*2) /2 = 32643
root@saker 07:16:09>create table tt(id int, name1 char(20), name2 varchar(100), name3 varchar(32643));
Query OK, 0 rows affected (0.18 sec)
root@saker 07:16:12>desc tt;
+-------+----------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id    | int(11)        | YES  |    | NULL    |      |
| name1 | char(20)      | YES  |    | NULL    |      |
| name2 | varchar(100)  | YES  |    | NULL    |      |
| name3 | varchar(32643) | YES  |    | NULL    |      |
+-------+----------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
root@saker 07:15:08>create table tt(id int, name1 char(20), name2 varchar(100), name3 varchar(32644));
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
所以设计表的时候,这个要注意了,每⼀⾏是有长度限制的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。