根据自己多年的工作经验,特别是在接收旧的项目时,varcahr的长度设置有不同的风格,针对varchar长度的设置问题,自己划分了不同的门派。

1.强迫症派:长度设置为4或者8的倍数,达到内存对齐的目的;

2.贴心派:长度设置成(2^n)-1;

3.务实派:需要多长就设置多长,不关心2的几次幂;

4.逍遥派:varchar是存储可变长字符串的,n值尽可能设置的大,比如varchar(1000)。

下面分析那种方案更合理:

1.varchar(n)的最大值字符数是多少

varchar的最大可以保存65535字节,但是具体保存多少个字符,不同的编码不一样。

MySql 5.0 之前的版本: n指的是n个字节

n的最大值是65535,如果存放utf-8格式只能保存 (n / 3)个汉字,即如果varchar(20) 那么只能保存6个汉字;

MySql 5.0 之后的版本: n指的是n个字符

如果存放utf-8格式,那么无论是数字,字母还是汉字,都可存放n个,即如果varchar(20) 那么可以保存20个汉字(自己亲测可以);

gbk类型:varchar(n)中每个字符最多占2个字节,最大长度不能超过(65535 / 2);

utf-8类型:varchar(n)中每个字符最多占3个字节,最大长度不能超过(65535 / 3)。

2.varchar(n)需要1到2个额外字节记录长度n的值

当n<=255的时候,只需要1个字节记录即可(数据表示范围:0 ~ (2^8-1),即0~255);当n>255的时候,则需要2个字节存储n的值((2^8)~ (2^16)-1,即256~65535)。

varchar字段报错的实际值得长度保存在第一个或者前两个字节中。

所以:

a.如果varchar(20),实际是需要1+20个字节的存储空间;

b.如果varchar(255),实际是需要1+255个字节的存储空间;

c.如果varchar(256),实际是需要2+256个字节的存储空间;

d.如果varchar(500),实际是需要2+500个字节的存储空间.

因此1.强迫症派的n=4或者8的倍数达到内存对齐的目的是不成立的,如果要达到内存对齐,varchar长度应该为(2^n)-1才能够达到,所以强迫症派的方法不可取。

3.varchar的内存对齐的问题

因为varchar是存储可变长字符串,

因此:

a.如果name varchar(8),那么name='12345678',实际长度为1+8;

b.如果name varchar(32),那么name='12345678',实际长度为1+8;

c.如果name varchar(16),那么name='1234',实际长度为1+4;

估:

贴心派的varchar长度应该为(2^n)-1是不能够达到内存对齐的目的的,长度是以实际保存的字符串长度为准的,因此贴心派也是不准确的。

另外,InnoDB是以页(page)为基本的存储单位,一个页会有一行或者多行(row)数据,数据的读取是基于page的,不是按照row读取的,因此也就没有内存对齐的问题了。

4.n值尽可能设置的大的问题

逍遥派的结论一看就不靠谱,但是还是需要理论进行驳斥的。

在MySql在查询是需要创建临时表的时候(union,order by、group by,子查询),在MySql读取数据之前,是只知道varchar的长度n,不知道实际数据的长度的,但是读取数据之前需要预分配内存空间,MySql是根据varchar(n)中的n来进行分配内存的,这样也是最合理的方式,不可能分配小于n个字符的空间,因此针对逍遥派的varchar(1000)设置就会预先分配1000个字符空间,很显然这个是十分不靠谱的设计。

结论:

varchar需要多长就设置多长,不必考虑2的多少次幂的问题。但是如果遇到了varchar(256)这种情况,你为啥不将他设置为varchar(255)呢,明显节省了一个存储长度的字节呀。因此务实派方案虽然最靠谱,但是也是要考虑255这个界限的。

mysql设置varchar_MySql中varchar长度的设置问题相关推荐

  1. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  2. allegro标注尺寸设置_Allegro中尺寸标注参数的设置-EDA/PCB-与非网

    Allegro中尺寸标注有很强大的功能,包括线性标注,角度标注,引线标注等.下面介绍一下Allegro中尺寸标注参数的设置.执行Manufacture– Dimension/Draft– Parame ...

  3. matlab2014示波器怎么调横轴范围,SIMULINK示波器参数设置_matlab中对示波器进行设置...

    描述 SIMULINK示波器参数设置 在SIMULINK中,示波器常用来作为输出工具,将模型的运行结果展现在人们面前.它把信号按照时间的顺序在二维坐标轴上显示出来.示波器的横坐标表示时间轴,纵坐标表示 ...

  4. mysql in varchar_MySQL中char和varchar有啥区别?优缺点是啥?

    在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 c ...

  5. mysql 中varchar_MYSQL中VARCHAR和CHAR类型

    存储引擎存储CHAR或者VARCHAR值的方式在内存中和在磁盘上可能不一样,所以MYSQL服务器从存储引擎读出的值可能需要转换为另一种存储格式 VARCHARvarchar类型用于存储可变长字符串.比 ...

  6. xadmin与mysql数据库_Xadmin中的功能及设置

    [Django--Xadmin中的功能](http://blog.csdn.net/lyysr/article/details/48735053) [django使用xadmin的全局配置](http ...

  7. mysql设计表时 varchar长度_设计表的时候,对变长字段长度选择的一点思考

    设计表时,不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的. 对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varch ...

  8. matlab tek示波器,SIMULINK示波器参数设置_matlab中对示波器进行设置

    在SIMULINK中,示波器常用来作为输出工具,将模型的运行结果展现在人们面前.它把信号按照时间的顺序在二维坐标轴上显示出来.示波器的横坐标表示时间轴,纵坐标表示信号的强度.仿真过程中我们可以按照需要 ...

  9. html中颜色怎么设置,html中按钮颜色怎么设置

    在html中,可以通过在button按钮元素使用style属性,添加"background-color:颜色值;"样式来设置按钮的背景颜色,添加"color:颜色值;&q ...

最新文章

  1. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)
  2. 数智化转型人才“大考”,综合人才成为企业“基础设施”
  3. 2020-10-19 Keil安装及使用
  4. java compareandset 包_Java AtomicReferenceArray compareAndSet()用法及代码示例
  5. php输出图片没有,ThinkPHP里无法输出图片 设置响应头
  6. 主席树学习小结(POJ 2104)
  7. 搭建微信公共平台的本地测试
  8. js table的所有td 按行合并
  9. 二维码用的完吗?有没有二维码图案用完的那天?
  10. 利用python自动发邮件
  11. 记redis的一个测试
  12. 冒险岛079服务端_linux版(ubuntu,CentOS)下载
  13. CMMI认证需要什么条件?
  14. 《分布式系统架构:技术栈详解与快速进阶》导读
  15. 汽车空调管路气密性检测
  16. 解决Mac版 snipaste 不在菜单栏显示,无法修改快捷键
  17. UNI-APP实现扫描二维码
  18. 台式计算机用什么电源线,电脑电源线有什么规格
  19. mysql通过视图插入数据_数据库视图 sql
  20. hdu-5745 La Vie en rose bitset

热门文章

  1. Java类集框架详细汇总
  2. 这些是最热门的机器学习技术!
  3. 20211125题目
  4. SteamVR Plugin安装教程
  5. bash permission denied
  6. 罗马数字和阿拉伯数字互化 java实现
  7. js根据输入的地址获得经纬度(百度地图)
  8. CAM350导入gerber文件报错“Apertures are used which have a size of 0“的解决
  9. Linux + ChromiumOS操作系统资源(转载)
  10. linux不解压zip包直接取出其中的文件