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

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. 漫游Kafka设计篇之性能优化(7)
  2. php 命令执行脚本文件路径,php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法...
  3. flink 8 state checkpoint savepoint区别
  4. 工具类的方法怎么引用_Java实用工具类:File工具类方法学习,可创建目录及文件...
  5. PG git pull
  6. ashx连接mysql_对C#中的web访问mysql数据库的一些知识点进行了整理归纳总结
  7. wget python3_python wget
  8. __mmc_claim_host
  9. SVO: Fast Semi-Direct Monocular Visual Odometry
  10. 显卡是什么?显卡和Graphics的区别在哪里?
  11. 我们应该如何做外链?
  12. 蓝牙耳机连接电脑,找不到stereo模式
  13. linux普通用户密码到期修改为原密码方法
  14. c语言程序设计精髓 第13周练兵题
  15. 前端表单神器form-create,复杂表单轻松搞定
  16. CentOS 可以ping通IP和域名,但打开火狐却上不了网
  17. 【入门6】函数与结构体【完结】
  18. 计算机三级网络技术最全知识点总结六
  19. Spring事务报错Transaction synchronization is not active
  20. linux 中的 ln 命令,Linux ln命令操作指南

热门文章

  1. 利用mysql客户端查询UCSC数据库
  2. ERP的主要功能模块简介
  3. 计算机蓝屏重启,电脑蓝屏怎么解决?电脑蓝屏自动重启解决方法
  4. JavaGUI——背景图片设置
  5. 基于yolov3 v4 v5的电梯轿厢下的电动车目标检测
  6. crmeb多商户二开crmeb架构二开文档异常处理【4】
  7. 移动硬盘需要格式化才能打开如何解决?
  8. [lua]紫猫lua教程-命令宝典-L1-01-07. table表
  9. KC伺服舵机四个方向的打包程序
  10. cce是什么意思_CCE 是什么