mysql设置varchar_MySql中varchar长度的设置问题
根据自己多年的工作经验,特别是在接收旧的项目时,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长度的设置问题相关推荐
- MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...
- allegro标注尺寸设置_Allegro中尺寸标注参数的设置-EDA/PCB-与非网
Allegro中尺寸标注有很强大的功能,包括线性标注,角度标注,引线标注等.下面介绍一下Allegro中尺寸标注参数的设置.执行Manufacture– Dimension/Draft– Parame ...
- matlab2014示波器怎么调横轴范围,SIMULINK示波器参数设置_matlab中对示波器进行设置...
描述 SIMULINK示波器参数设置 在SIMULINK中,示波器常用来作为输出工具,将模型的运行结果展现在人们面前.它把信号按照时间的顺序在二维坐标轴上显示出来.示波器的横坐标表示时间轴,纵坐标表示 ...
- mysql in varchar_MySQL中char和varchar有啥区别?优缺点是啥?
在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 c ...
- mysql 中varchar_MYSQL中VARCHAR和CHAR类型
存储引擎存储CHAR或者VARCHAR值的方式在内存中和在磁盘上可能不一样,所以MYSQL服务器从存储引擎读出的值可能需要转换为另一种存储格式 VARCHARvarchar类型用于存储可变长字符串.比 ...
- xadmin与mysql数据库_Xadmin中的功能及设置
[Django--Xadmin中的功能](http://blog.csdn.net/lyysr/article/details/48735053) [django使用xadmin的全局配置](http ...
- mysql设计表时 varchar长度_设计表的时候,对变长字段长度选择的一点思考
设计表时,不管是在MSSQL还是MySQL或者Oracle,变长字段的长度衡量都是要经常面对的. 对于一个变长的字段,在满足业务的情况下(其实所谓的满足业务是一个比较模糊的东西),到底是选择varch ...
- matlab tek示波器,SIMULINK示波器参数设置_matlab中对示波器进行设置
在SIMULINK中,示波器常用来作为输出工具,将模型的运行结果展现在人们面前.它把信号按照时间的顺序在二维坐标轴上显示出来.示波器的横坐标表示时间轴,纵坐标表示信号的强度.仿真过程中我们可以按照需要 ...
- html中颜色怎么设置,html中按钮颜色怎么设置
在html中,可以通过在button按钮元素使用style属性,添加"background-color:颜色值;"样式来设置按钮的背景颜色,添加"color:颜色值;&q ...
最新文章
- 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)
- 数智化转型人才“大考”,综合人才成为企业“基础设施”
- 2020-10-19 Keil安装及使用
- java compareandset 包_Java AtomicReferenceArray compareAndSet()用法及代码示例
- php输出图片没有,ThinkPHP里无法输出图片 设置响应头
- 主席树学习小结(POJ 2104)
- 搭建微信公共平台的本地测试
- js table的所有td 按行合并
- 二维码用的完吗?有没有二维码图案用完的那天?
- 利用python自动发邮件
- 记redis的一个测试
- 冒险岛079服务端_linux版(ubuntu,CentOS)下载
- CMMI认证需要什么条件?
- 《分布式系统架构:技术栈详解与快速进阶》导读
- 汽车空调管路气密性检测
- 解决Mac版 snipaste 不在菜单栏显示,无法修改快捷键
- UNI-APP实现扫描二维码
- 台式计算机用什么电源线,电脑电源线有什么规格
- mysql通过视图插入数据_数据库视图 sql
- hdu-5745 La Vie en rose bitset