MySQL字段类型VARCHAR

varchar(n),n表示什么

  • MySQL5.0.3以前varchar(n)这里的n表示字节数
  • MySQL5.0.3以后varchar(n)这里的n表示字符数,好比varchar(200),无论是英文仍是中文均可以存放200个

VARCHAR字段限制缘由

字段的限制在字段定义的时候有如下规则:编码

  • a) 存储限制 varchar字段是将实际内容单独存储在聚簇索引以外,内容开头用1到2个字节表示实际长度(长度超过255时须要2个字节),所以最大长度不能超过65535。
  • b) 编码长度限制 字符类型若为gbk,每一个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每一个字符最多占3个字节,最大长度不能超过21845。 对于英文比较多的论坛 ,使用GBK则每一个字符占用2个字节,而使用UTF-8英文却只占一个字节。 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
  • c) 行长度限制 致使实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。 若定义的表长度超过这个值,则提示“ERROR 1118 (42000): Row size too large. ”

举两个例说明一下实际长度的计算。

  • a) 若一个表只有一个varchar类型,如定义为 create table t4(c varchar(N)) charset=gbk; 则此处N的最大值为(65535-1-2)/2= 32766。 减1的缘由是实际行存储从第二个字节开始; 减2的缘由是varchar头部的2个字节表示长度; 除2的缘由是字符编码是gbk。spa

  • b) 若一个表定义为 create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8; 则此处N的最大值为 (65535-1-2-4-303)/3=21812 减1和减2与上例相同; 减4的缘由是int类型的c占4个字节; 减303的缘由是char(30)占用90个字节,编码是utf8。 若是被varchar超过上述的b规则,被强转成text类型,则每一个字段占用定义长度为11字节,即字段再也不是“varchar”。索引

相关文章
相关标签/搜索