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的更多相关文章

  1. 【转】MySQL中varchar最大长度是多少?

    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...

  2. int(11)最大长度是多少,MySQL中varchar最大长度是多少(转)

    int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表 ...

  3. mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别

    mysql字段varchar区分大小写utf8_bin.utf8_general_ci编码区别 在mysql中存在着各种utf8编码格式:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大 ...

  4. 浅谈mysql中varchar(m)与char(n)的区别与联系

    mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的)    原因是MySQL在建表的 ...

  5. MySQL中varchar最大长度是多少?

    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...

  6. MySQL中varchar与char区别

    MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...

  7. MySQL的varchar长度问题

    From: http://blog.csdn.net/longyulu/article/details/7863737 http://dinglin.iteye.com/blog/914276 htt ...

  8. mysql 的varchar类型小记

    参考链接:MySQL的varchar长度问题 今天用mysql做一个demo,创建了个表: -- 借款表 CREATE TABLE jk ( id ) NOT NULL auto_increment, ...

  9. MySQL中varchar最大长度是多少

    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...

随机推荐

  1. 51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)

    1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一天,欧姆诺诺姆来到了朋友家里,他发现了 ...

  2. 30款基于 jQuery & CSS3 的加载动画和进度条插件

    我们所生活每一天看到的新技术或新设计潮流的兴起,Web 开发正处在上升的时代.HTML5 & CSS3 技术的发展让 Web 端可以实现的功能越来越强大. 加载动画和进度条使网站更具吸引力.该 ...

  3. 在asp.net 中生成PDF的方法

    近期要用asp.net 2.0生成PDF,看了下书,查了下资料,发现可以有组件帮得上忙,可以下载itextsharp(https://sourceforge.net/projects/itextsha ...

  4. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行

    [算法]01分数规划-最优比率环 [题意]给定有向图,点有收益,边有代价,重复经过的话收益不叠加而代价叠加,求从任意点开始最后回归该点的(收益/代价)最大. [题解] 和普通的分数规划不同,这里的方案 ...

  5. redis笔记之两种持久化备份方式(RDB & AOF)

    Redis支持的两种持久化备份方式(RDB & AOF) redis支持两种持久化方式,一种是RDB,一种是AOF. RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命 ...

  6. Django之Form组件验证

    今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类)    ·前端把数据提交过来 ·匹配规则 · ...

  7. SpringMVC可以配置多个拦截后缀*.action和.do等

    首先介绍一下.do和.action的区别: struts早期的1版本,以.do为后缀. 同时spring的MVC也是以.do为后缀. 几年前struts收购鼎鼎大名的webwork2和开发团队后,将w ...

  8. elk系列6之tcp模块的使用【转】

    preface tcp模块的使用场景如下: 有一台服务器A只需要收集一个日志,那么我们就可以不需要在这服务器上安装logstash,我们通过在其他logstash上启用tcp模块,监听某个端口,然后我 ...

  9. openjudge-NOI 2.6-1996 登山

    题目链接:http://noi.openjudge.cn/ch0206/1996/ 题解: 正反求两次LIS即可 #include<cstdio> #include<cstring& ...

  10. Docker Commands

    Docker Commands 安装,以Ubuntu 14.04.3为例 apt-get install docker.io 注意安装之前需要更新系统 列出曾经存在的容器 docker ps -a 列 ...