mysql中字符串类型char(n)和varchar(n)的区别
n的含义
根据网络上找到的结果(不能保证准确),在5.0.3以后版本中,n均代表字符数,而不是字节数;我用来测试的版本是5.7.20,该版本中,n表示字符数。
验证过程如下
建表
CREATE TABLE `teststring` (
`c` char(4) DEFAULT NULL,
`v` varchar(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据并查询数据长度
INSERT INTO teststring VALUES ('幻乐之城','幻乐之城')
SELECT LENGTH(v),CHAR_LENGTH(v),LENGTH(c),CHAR_LENGTH(c) FROM teststring;
结果如下:

所需存储空间
- char(n)需要固定的存储空间,即当存入的字符长度小于n时,所需空间仍然是n个字符所需的存储空间(由于字符编码不确定,所以长度也无法确定);
- varchar(n)的所需存储空间是随字符长度而变化的,因为varchar类型存储了当前字符的长度;
varchar最大数据长度
- mysql的vachar字段的类型最大长度是65535,但实际存储的数据长度要小于该值;
- 当数据长度小于255时,数据库采用1个字节记录varchar数据长度,当数据长度>255时,需要用两个字节存储长度;
- NULL标识位,如果varchar字段定义中带有default null允许列空,则需要需要1bit来标识,每8个bits的标识组成一个字段。一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位
- 如果表中varchar类型不可以为null,则最大数据长度可以到65533
- 如果数据表只有一个varchar字段且该字段DEFAULT NULL,那么该varchar字段的最大长度为65532个字节,即65535-2-1=65532 byte;
- 如果表中所有varchar字段均为not null 则最大数据长度可为65533
-
- varchar 的最大长度受限于最大行长度(max row size,65535bytes),假如create table tt(age int,addr varchar(N) default null) charset=utf8 则addr字段N的最大值为(65535-1-2-4)/3,1是因为null标志,2是因为存储长度值,4是因为int子段和行长度限制
- 可存储的最大字符数和字符编码有关,如当采用utf8编码时,一个数字或字母占1个字节,一个汉字占3个字节;
- 可参考https://dev.mysql.com/doc/refman/5.7/en/char.html
char最大数据长度
- char类型字段的最大长度是255,且255个字节可全部用于存储数据;
- 由于char类型没有记录数据长度,所以导致其尾部的空格在存储时会被去掉;
- 如果某个长度小于n,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)
参考:
http://www.cnblogs.com/gomysql/p/3615897.html
mysql中字符串类型char(n)和varchar(n)的区别的更多相关文章
- MySQL中数据类型(char(n)、varchar(n)、nchar(n)、nvarchar(n)的区别)(转)
一.第一种 char(n)和varchar(n)的区别: 在这里我们可以清楚的看到他们表面的区别就是前面是否有var,在这里解释一下var是什么意思,var代表“可变的”的意思 下面看个例子: )// ...
- MySQL——字符串类型——char(n) 和 varchar(n)
MySQL 的 char(n) 和 varchar(n) 括号中 n 代表字符的个数,而非字节个数,这里说的字符不论文字种类,假设一个字段的数据类型被规定为 char(2),则可以在这个字段上插入 ' ...
- MySQL中字符串与数字比较的坑
公司项目代码中,某枚举字段数据库表中类型是char(1),在代码中,误以为是TINYINT,所以用数字筛选,后来发现结果不对.发现了一个现象,用数字0筛选会把所有的记录给筛选出来. 经过排查发现是在M ...
- <经验杂谈>Mysql中字符串处理的几种处理方法concat、concat_ws、group_concat
Mysql中字符串处理的几种处理方法concat.concat_ws.group_concat以下详情: MySQL中concat函数使用方法:CONCAT(str1,str2,-) 返回结果为连接参 ...
- mysql数值字符串类型的按照数值进行排序
今天遇到一个问题,就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动 ...
- mysql中geometry类型的简单使用
mysql中geometry类型的简单使用 编写本文的目的: 让和两天前的我一样的初学者,能够更快的使用geometry类型存储空间点数据 也是为了自己加深印象,更熟练的使用geometry类型 ...
- MYSQL中 ENUM 类型
MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...
- Mysql中字符串正确的连接方法
虽然SQL server和My sql的语句基本都一致,但是仍然存在一些小区别.就如字符串的连接来说,SQL server中的字符串连接是使用“+”来连接,不带引号sql server是做加法运算.而 ...
- 关于Java读取mysql中date类型字段默认值'0000-00-00'的问题
今天在做项目过程中,查询一个表中数据时总碰到这个问题: java.sql.SQLException:Value '0000-00-00' can not be represented as ...
随机推荐
- 深入浅出js中的this
Q:this是什么? A:this是Javascript语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,在每个 function 中自动根据作用域(scope) 确定, 指向的是此次调用者 ...
- 用UGUI制作可根据手指位置自动定位的隐形遥杆
之前写过遥杆怎么做,这里依然用的是之前的方法,就不介绍了. 之前玩过<蜡烛人>,发现手游版的<蜡烛人>的遥杆是看不见的,手指直接在屏幕左边滑动人物就可以移动,可能是为了增强沉浸 ...
- mysql的安装教程-【linux】
先卸载系统自带的mysql,停止mysql:service mysql stop 1.查找以前是否装有mysql命令:rpm -qa|grep -i mysql可以看到mysql的几个包:qt-mys ...
- Netty源码分析第5章(ByteBuf)---->第1节: AbstractByteBuf
Netty源码分析第五章: ByteBuf 概述: 熟悉Nio的小伙伴应该对jdk底层byteBuffer不会陌生, 也就是字节缓冲区, 主要用于对网络底层io进行读写, 当channel中有数据时, ...
- CocoStuff—基于Deeplab训练数据的标定工具【一、翻译】(未完)
一.CocoStuff简介 CocoStuff是一款为deeplab设计的,运行在Matlab中的语义标定工具,其标定结果和结合Deeplab训练出的结果均为mat文件格式,该项目源码已在github ...
- NO.8:自学python之路------并行socket网络编程
摘要 一到放假就杂事很多,这次的作业比较复杂,做了一个周,进度又拖了.不过结果还不错. 正文 粘包 在上一节中,如果连续发送过多数据,就可能发生粘包.粘包就是两次发送的数据粘在一起被接收,损坏了数据的 ...
- Qt tableWidget 空单元格 获取选中行行号
bool focus = tableWidget->isItemSelected(tableWidget->currentItem()); // 判断是否选中一行 Int row1 = t ...
- linux go环境安装
方法一 这次将源码包安装的目录是是/root下. 1.官网下载源码包. 官网链接:https://golang.org/dl/ wget https://storage.googleapis.co ...
- IE10不能显示JSON文件内容
IE7,8,9下Ajax返回后,再执行跳转,会弹出阻止提示框. 所以我采用WebForm 提交思想: //导出 jv.postOpen = jv.PostOpen = jv.Export = func ...
- mkswap命令详解
基础命令学习目录首页 原文链接:http://blog.51cto.com/arlen99/1743841 mkswap命令用于在一个文件或者设备上建立交换分区.在建立完之后要使用sawpon命令开始 ...




