当前位置: 首页 > news >正文

mysql varchar最大长度问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

mysql中一行数据最多存储65535个字节,如果使用varchar(N),N的取值依赖于create table时使用的字符集。latin1、gbk、utf8编码存放一个字符分别需要占1、2、3个字节。下面的实验字符集为latin1。

如果数据表只有一个varchar字段且该字段DEFAULT NULL,那么该varchar字段的最大长度为65532个字节,即65535-2-1=65532 byte。

create table test3(a varchar(65533));

只有一个字段时,max(N)=65535-2-1,2个字节用于标识实际占用长度(16bit),1个字节用于标识字段NULL,所以max(N)=65532。

拥有9个字段时,并且都是默认为NULL,最后一个字段i的max(N) = 65535 - 2*9 - 1 - 8189*8 = 4。

create table test3(a varchar(8189) default null,b varchar(8189) default null,c varchar(8189),d varchar(8189),e varchar(8189),f varchar(8189),g varchar(8189),h varchar(8189),i varchar(5));

如果前8个字段默认都是NOT NULL,最后一个字段i的max(N) = 65535 - 2*9 - 8189*8 = 5

 create table test4(a varchar(8189) not null,b varchar(8189) not null ,c varchar(8189) not null,d varchar(8189) not null,e varchar(8189) not null,f varchar(8189) not null,g varchar(8189) not null,h varchar(8189) not null,i varchar(5));

如果前8个字段都是NULL,最后一个字段 not null,最后一个字段i的max(N) = 65535 - 2*9 - 8189*8 = 5,说明只要在创建表时,存在任意一个字段not null,就不会占用NULL标识位,节约1个字节。

如果字段类型混搭 & 默认都是NULL,max(N) = 65535-4-2-1=65528

 create table test4(a varchar(65529),age int);

如果有一个为not null,max(N) = 65535-4-2-1 = 65528

create table test4(a varchar(65529) not null,age int);

以上介绍的是行数据的最大长度,下面介绍的是创建索引时key的长度计算

create table test0(a varchar(10),b varchar(10));
create index ab_idx on test0(a,b);
explain select a from test0;

key=(10+2+1)*2 = 26个字节;2个字节用于标识实际占用长度(16bit),1个字节用于标识字段NULL。如果将一个字段修改成not null,则key=10*2 + 2*2+ 1 = 25,少一个字节是因为字段a为not null,节省了一个字节的占用。key的计算依然和字符集有关系,这里使用的是latin1。

alter table test0 modify a varchar(10) not null;

参考:

https://www.cnblogs.com/gomysql/p/3615897.html

https://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html

转载于:https://my.oschina.net/u/2302503/blog/1620789

相关文章:

  • RabbitMQ 高可用集群搭建及电商平台使用经验总结
  • pandas Dataframe['A']与Dataframe[['A']]的区别
  • VS2010 c++生成和调用dll例子(转载)
  • 使用mongoose和bcrypt实现用户密码加密
  • Android WebView基本用法及常见问题
  • 9.Azure文件(文件共享)-NAS(下)
  • 用CORS 解决vue.js django跨域调用
  • 2U 4节点Xeon SP服务器 (上):PowerEdge C6420更受重视
  • Laravel5.5 生成测试数据
  • Docker CentOS7 安装SSH
  • BZOJ3273 : liars
  • Python学习记录——Ubuntu(一)基本配置、快捷键和系统启停命令行
  • 使用Shiro进行权限控制的实现流程
  • mysql开发之---每日一得01
  • 网络基础CCNP|OSPF(5)
  • 【React系列】如何构建React应用程序
  • ECS应用管理最佳实践
  • javascript 总结(常用工具类的封装)
  • js写一个简单的选项卡
  • js作用域和this的理解
  • Laravel 中的一个后期静态绑定
  • Linux Process Manage
  • spring boot下thymeleaf全局静态变量配置
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • springMvc学习笔记(2)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 从重复到重用
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于List、List?、ListObject的区别
  • 基于web的全景—— Pannellum小试
  • 简析gRPC client 连接管理
  • 如何进阶一名有竞争力的程序员?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 突破自己的技术思维
  • 学习HTTP相关知识笔记
  • 阿里云移动端播放器高级功能介绍
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #大学#套接字
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (C语言)球球大作战
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (九)信息融合方式简介
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ..回顾17,展望18
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .CSS-hover 的解释
  • .Net - 类的介绍
  • .NET Framework杂记
  • .NET6 命令行启动及发布单个Exe文件
  • .NET与 java通用的3DES加密解密方法
  • ??在JSP中,java和JavaScript如何交互?
  • @Documented注解的作用