以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的不过后来群里有人给了解释,突然才发现原来事情不是这么简单

MYSQL COMPACT格式,每条记录有一个字节来表示NULL字段分布,如果表中有字段允许为空,则最大只能定到65532,如果没有字段允许为空,则那个字节可以节省,最大可以定义到65533,不知道是不是这个原因

于是上网看了些资料,又在本地做了些实验,原来vachar的最大长度真的是不定的(根据是否有非空字段来决定)

在本地做了下实验,innodb+latin的环境

-- success

drop table if exists test;

create table test(name varchar(65533) not null)engine=innodb DEFAULT CHARSET=latin1

-- too large

drop table if exists test;

create table test(name varchar(65533))engine=innodb DEFAULT CHARSET=latin1

对于第二种情况,允许空字段的时候是不能加到65533的长度的,最大只能到65532,到底应该是引文的那种说法。

网上也有人做了类似的实验,参考http://stackoverflow.com/questions/8295131/best-practise-for-sql-varchar-column-length

name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1)

name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1)

name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1)

name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte

总结一下,原来mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532。

以下是其它网友的补充说明:这不是一个固定的数字。本文简要说明一下限制规则。

strlen 计算字符串长度,一个中文当2字符

mb_strlen根据它的字符编码模式,统计字符quot

count计算数组中的元素数目或对象中的属性个数

header('Content-Type:text/html;charset=UTF-8');

$string1="谢春业";//定义中文字符变量

$string2="xcy";//定义英文字符变量

//直接输出看看他们的长度

echo strlen($string1);

echo "";

echo strlen($string2);

echo "";

//用 php 多字节扩展函数 mb_strlen试试看

echo mb_strlen($string1,'utf8');

echo "";

echo mb_strlen($string2,'utf8');

echo "";

?>

输出结果是:

9

3

3

3

1、限制规则

字段的限制在字段定义的时候有以下规则:

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. 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”了。

mysql 最大长度_mysql VARCHAR的最大长度到底是多少相关推荐

  1. mysql字段最大长度_MySQL VARCHAR字段最大长度到底是多少

    varchar(n),n表示什么? MySQL5.0.3之前varchar(n)这里的n表示字节数 MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是 ...

  2. mysql vchar 最大长度_mysql VARCHAR的最大长度到底是多少

    以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的 不过后来群里有人给了解释,突然才发现原来事情不是这么简单 MYSQL COMPACT格式,每条记录有一 ...

  3. mysql utf-8长度_MySQL VARCHAR长度和UTF-8?mysql

    mysql5.0.3及以前版本varchar类型最大长度是255字符, 之后版本理论上长度可取值范围是1到65535字节,但实际上不可能取到这么大的值,原因是65535字节是mysql1行数据占用的长 ...

  4. mysql varchar 默认长度_MySQL VARCHAR类型字段到底可以定义多长

    MySQL 单行行长最大是65535,不包含TEXT,BLOB类型. varchar 长度小于255时,需要额外使用1字节存储长度,大于255时,需要 额外使用2字节存储长度. varchar 栏位如 ...

  5. MySQL中TEXT数据类型的最大长度___MySQL VARCHAR字段最大长度究竟是多少

    MySQL TEXT数据类型的最大长度 TINYTEXT 256 bytes TEXT 65,535 bytes ~64kb MEDIUMTEXT 16,777,215 bytes ~16MB LON ...

  6. MySQL的char与varchar:类型长度 记录字节 截取报错 保存trim 数据校验 存储占用

    1.类型范围 2.占用字节 CHAR是定长字符串类型,不论其存放的字符串长短,统一都会占用m字节: VARCHAR是变长字符串类型,在声明时虽然指定其长度m,仅指其能存放字符串的最长长度: 存放的字符 ...

  7. mysql 联合索引长度_MySQL 中索引的长度的限制

    单列索引的长度的限制 (5.6里面默认不能超过767bytes,5.7不超过3072bytes): 起因是256×3-1=767.这个3是字符最大占用空间(utf8).但是在5.5以后,开始支持4个字 ...

  8. mysql使用的索引长度_MySQL索引的索引长度问题

    MySQL索引的索引长度问题: Specified key was too long;max key length is 1000 bytes. 一.修改mysql的默认存储引擎: 1.查看mysql ...

  9. mysql表date类型长度_mysql中数据类型的长度解释

    11.2. 数值类型 MySQL支持所有标准SQL数值数据类型.这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.RE ...

  10. mysql int数据类型长度_mysql中int数据类型长度的问题

    在定义了mysql中int数据类型后,后面填写的长度有什么用呢?下文将对mysql中int数据类型长度进行详细的介绍,希望对您能有所帮助. mysql中int数据类型长度最大为11位,最少为4位,不够 ...

最新文章

  1. python读取txt文件代码-Python实现读取txt文件并画三维图简单代码示例
  2. python引用类 魔法方法_Python 学习笔记 -- 类的魔法方法
  3. abb变频器acs880说明书_常见品牌变频器修改功率方法大全
  4. 详解 springboot - 查看、修改内置 tomcat 版本
  5. try…finally与嵌套及自定义异常抛出
  6. java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
  7. 烂大街的常用Linux命令、工具
  8. LNMP详解(四)——LNMP原理与简单部署
  9. mybatis mysql like 传参问题_记一次使用mybatis进行like 模糊查询遇到的问题
  10. 剖析 TCP协议内部结构
  11. Android Studio查看MD5与SHA1
  12. 为什么有了二叉搜索树和二叉平衡树之后还需要红黑树?
  13. 云科技网络验证源码_【原创】酸酸云科技-网络验证界面版注册机注入工具 V3.2...
  14. IOS9 未受信任的企业级开发者 没有信任按钮 解决
  15. 治疗长期失眠的最好食物,不可错过!
  16. libsvm警告: WARNING: reaching max number of iterations 解决办法
  17. 3.2 从关系型数据库中查询数据
  18. hyperv 服务器性能,Hyper-v 处理器性能
  19. Xamainr 地图之webview初探
  20. SharePoint定制开发个性皮肤

热门文章

  1. 电路交换、报文交换与分组交换
  2. 与报文交换比较,分组交换有哪些优点?
  3. 基于微信校园二手书交易小程序系统 毕业设计毕设参考
  4. 小程序项目:基于微信小程序的校园互助平台——计算机毕业设计
  5. html导航栏的渐变效果,html+css+js实现导航栏滚动渐变效果
  6. oracle里xdb用户,修改Oracle XDB默认监听端口
  7. 微信公众号H5 - 使用vue开发微信公众号网页
  8. 正态性检验(Normality test)
  9. PPT设置密码和加水印的方法
  10. HashSet判断重复项原理