MySQL之varchar
MySQL之varchar
0.前言
探究关于MySQL中varchar长度的定义
1.研究MySQL的varchar列类型的背景
1.MySQL5.x
2.InnoDB
2.varchar
对于varchar的争论,目前总结来看,主要有三种看法:(注:以下讨论仅仅在非严格模式下的MySQL)
第一种:(错误)
varchar(3)表示varchar能存储3个字节,存储如下表:
要插入的字符 | 实际存入的字符 | 占用长度 |
---|---|---|
ab | ab | 2字节 |
abc | abc | 3字节 |
abcd | abc | 3字节 |
第二种:(4.x版本)
varchar(3)不能表示varchar能存储3个字节,因为按照MySQL官方文档的定义,会有一个字节用来存储长度,所以3个字节只能存两个字母字符。
要插入的字符 | 实际存入的字符 | 占用长度 |
---|---|---|
ab | ab | 3字节 |
abc | ab | 3字节 |
abcd | ab | 3字节 |
这种说法很有道理,因为官方文档都说了,会有一个字节用来存储长度。这里把文档的原话翻译一下引入进来:
VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
第三种:(5.x版本)
varchar(3)表示varchar能够存储3个字符,注意这里是字符,不是字节。也就是说无论汉字,还是字母等,都是一个字符。
要插入的字符 | 实际存入的字符 | 占用长度 |
---|---|---|
ab | ab | 3字节 |
abc | abc | 4字节 |
abcd | abc | 4字节 |
中国人 | 中国人 | 10字节 |
这里有个前提,即编码格式是UTF8。这是需要注意的点是中间的连字符:数据库中为UTF8 ,在程序中是UTF-8.
MySQL字符集
MySQL字符集的解释,http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/charset.html
MySQL支持的字符集有Unicode字符集,西欧字符集,中欧字符集,南欧与中东字符集,波罗的海字符集,西里尔字符集和亚洲字符集。
这么多我也是看醉了。最常用的是Unicode字符集,而这种字符集里又分两种,一种ucs2,另一种为utf8
UTF8字符集的思想,是不同Unicode字符采用变长字节序列编码:
- 基本拉丁字母,数字和标点使用一个字节
- 大多数的欧洲和中东手写字母适合两个字节序列
- 韩语,中文和日本象形文字使用三个字节序列
3.MySQL存储
上一章讨论的结果,从官方文档中证实5.x下第三种说法是正确的。如果要存50个字符,就定义成varchar(50)。
以前老代码中,很多都都定义成varchar(63),varchar(127),varchar(255)这样。这是MySQL4.x的影响。
MySQL的InnoDB存储结构
MySQL中InnoDB的数据存储结构从大到小,分为:Tablespace,segment,extend,page(block),row。
page的另一个名字叫做block,和hadoop中的block类似。
每个table对应一个tablespace,在tablespace中,index/数据/transaction信息又各自存放于不同的segment。
每个segment又分64个连续page,每个page固定大小16K。
4.结论
存储引擎是按页读取的,也就是说,内容最好在一页上。但是page的子节点是row和索引,而且对于数据存储量,我们是无法控制的。
所以一切就OUT OF CONTROLL了,以上的疑问没有什么卵用。
如果一列需要50个字符,就定义varchar(50),如果考虑扩展性,就可以定得再高一些。不必刻意去用63,127和255这样的数字来定义长度。
5.提醒和声明
参考5.1官方文档
http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/
MySQL之varchar的更多相关文章
- 【转】MySQL中varchar最大长度是多少?
一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...
- int(11)最大长度是多少,MySQL中varchar最大长度是多少(转)
int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表 ...
- mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别
mysql字段varchar区分大小写utf8_bin.utf8_general_ci编码区别 在mysql中存在着各种utf8编码格式:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大 ...
- 浅谈mysql中varchar(m)与char(n)的区别与联系
mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的) 原因是MySQL在建表的 ...
- MySQL中varchar最大长度是多少?
一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...
- MySQL中varchar与char区别
MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...
- MySQL的varchar长度问题
From: http://blog.csdn.net/longyulu/article/details/7863737 http://dinglin.iteye.com/blog/914276 htt ...
- mysql 的varchar类型小记
参考链接:MySQL的varchar长度问题 今天用mysql做一个demo,创建了个表: -- 借款表 CREATE TABLE jk ( id ) NOT NULL auto_increment, ...
- MySQL中varchar最大长度是多少
一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...
随机推荐
- JAVA中反射机制四
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射四 利用反射获取类的属性 1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后 ...
- js和jquery中的遍历对象和数组(forEach,map,each)
arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项,index当前项的索引,array原始数组: ...
- 前端观察:HTML5做得好,收入不比 iOS 差
谷歌奋进的绿色机器人超过了苹果的市场占有率,这一市场现象,导致了愈来愈多的开发者转投html5的怀抱.而HTML5将成为开发者拥抱同时拥抱Android和IOS的不二法门. 根据著名移动生态系统分析公 ...
- /i,/m,/s,/x,/A,/s,/U,/x,/j,/u 等正则修饰符用法~
i (PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配. m (PCRE_MULTILINE) 默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上 ...
- 4B/5B编码原理
4B/5B编码原理 什么是4B/5B编码? 4B/5B编码是百兆以太网(即快速以太网)中线路层编码类型之一,就是用5bit的二进制数来表示4bit二进制数,映射方式如下表所示: 为什么要进行4B/5B ...
- sed的额外用法(网摘)
#在我开始动手写一个一个的脚本的时候才会看到更多的用法 1. 在某行的前一行或后一行添加内容(前提是要确定行的内容) # 匹配行前加 sed -i '/allow/ideny' httpd.conf ...
- Maven如何发布项目到一个Tomcat中
首先,在本地tomcat的conf/tomcat-users.xml 中配置一个user,准备让maven接入时使用: <role rolename="admin-gui"/ ...
- systemd基础
systemd 起源 systemd这一名字源于Unix中的一个惯例:在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识.除此以外,systemd亦是借代英文术语D体 ...
- [重磅]Deep Forest,非神经网络的深度模型,周志华老师最新之作,三十分钟理解!
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 深度学习最大的贡献,个人认为就是表征 ...
- 【转+整理+答案】python315+道面试题
提示 自己整理的答案,很局限,如有需要改进的地方,或者有更好的答案,欢迎提出! [合理利用 Ctrl+F 提高查找效率] 第一部分 Python基础篇(80题) 1.为什么学习Python? # 因为 ...