mysql的binary、char、varchar区别

分类: Mysql/postgreSQL

2013-09-24 18:11:46

char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。

  • 如果需要存储的字符串的长度跟所有值的平均长度相差不大,适合用char,如MD5。
  • 对于经常改变的值,char优于varchar,原因是固定长度的行不容易产生碎片。
  • 对于很短的列,char优于varchar,原因是varchar需要额外一个或两个字节存储字符串的长度。

varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储
例外:Myisam引擎中使用ROW_FORMAT=FIXED时,每行使用相同的空间,造成浪费

char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较

binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制
binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节
进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速
按字符比较不区分大小写,而binary区分大小写,结尾使用\0填充,而不是空格
(出自:http://blog.sina.com.cn/s/blog_4de07d5e01010jc4.html)
--------------------------------------------------------------
ps:
对于binary类型的自动补\0,例子如下:
baseno为binary(6)时,执行insert into base_info(baseno) values('6');
在表中baseno的值形式上表示为‘98\0\0\0\0’,自动补\0,
所以在select的时候,必须如下:
select * from base_info where baseno='98\0\0\0\0';

----------------------------------------------------------------

字符串可以用来表示任何一种值,所以它是最基本的类型之一。我们可以用字符串类型来存储图象或声音之类的二进制数据,也可存储用gzip压缩的数据。下表介绍了各种字符串类型:

Table 1.3. 字符串类数据列类型

类型 最大长度 占用存储空间
CHAR[(M)] M字节 M字节
VARCHAR[(M)] M字节 L+1字节
TINYBLOD,TINYTEXT 2^8-1字节 L+1字节
BLOB,TEXT 2^16-1字节 L+2
MEDIUMBLOB,MEDIUMTEXT 2^24-1字节 L+3
LONGBLOB,LONGTEXT 2^32-1字节 L+4
ENUM('value1','value2',...) 65535个成员 1或2字节
SET('value1','value2',...) 64个成员 1,2,3,4或8字节

L+1、L+2是表示数据列是可变长度的,它占用的空间会根据数据行的增减面则改变。数据行的总长度取决于存放在这些数据列里的数据值的长度。 L+1或L+2里多出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。

如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。

ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。

字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:

二进制字符串被视为一个连续的字节序列,与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。

非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。

在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服务器的字符集作为默认字符集。

非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式:

二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。

非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。

二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳 20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字 节字符集,它能容纳的字符个数肯定少于20个。

1.2.2.1. CHAR和VARCHAR
CHAR和VARCHAR是最常用的两种字符串类型,它们之间的区别是:

CHAR是固定长度的,每个值占用相同的字节,不够的位数MySQL会在它的右边用空格字符补足。

VARCHAR是一种可变长度的类型,每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。

CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是从MySQL4.0.2版开始的。它们的作用是作为占位符或用来表示各种on/off开关值。

如何选择CHAR和VARCHAR,这里给出两个原则:

  • 如果数据都有相同的长度,选用VARCHAR会多占用空间,因为有一位用来存储其长度。如果数据长短不一,选用VARCHAR能节省存储空间。而CHAR不论字符长短都需占用相同的空间,即使是空值也不例外。
  • 如果长度出入不大,而且是使用MyISAM或ISAM类型的表,则用CHAR会比VARCHAR好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。
  • 在一个数据表里,只要有一个数据列的长度是可变的,则所有数据列的长度将是可变的。MySQL会进行自动地转换。一个例外,CHAR长 度小于4的不会进行自动转换,因为MySQL会认为这样做没必要,节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR,以减 少空间占用量。

mysql的binary、char、varchar区别相关推荐

  1. mysql 字符串类型 char varchar

    字符类型用在存储名字.邮箱地址.家庭住址等描述性数据   char指的是定长字符,varchar指的是变长字符 #官网:https://dev.mysql.com/doc/refman/5.7/en/ ...

  2. MySQL中的char和varcharmysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别

    1.varchar能存多少汉字.数字? 具体还是要看版本的,一个字符占用3个字节 ,一个汉字(包括数字)占用3个字节=一个字符 4.0版本以下,varchar(100),指的是100字节,如果存放UT ...

  3. 【038】MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?

    ♣题目部分 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? ♣答案部分 (1).varchar与char的区别区别一,定长和变长char 表示定长,长度固定, ...

  4. mysql char30_Mysql中varchar与char的区别以及varchar(30)中的30代表的涵义

    mysql中varchar与char的区别以及varchar(30)中的30代表的涵义 (1)varchar与char的区别 varchar存储可变长字符串,小于255字节时需要1个额外字节(大于25 ...

  5. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?

    (1).varchar与char的区别区别一,定长和变长     char 表示定长,长度固定,varchar表示变长,即长度可变.char如果插入的长度小于定义长度时,则用空格填充:varchar小 ...

  6. MySQL中的char、varchar(10)、varchar(1000)的区别

    这里写自定义目录标题 tips MySQL中的varchar与char的区别 varchar(100) 与varchar(1000)的区别 参考 tips 若无特殊指明,文中提到的存储空间指的都是占用 ...

  7. MySQL中的char与varchar详解

    mysql中char与varchar的区别 char:定长,效率高,一般用于固定长度的表单提交数据存储 :例如:身份证号,手机号,电话,密码等         varchar:不定长,效率偏低 1.v ...

  8. mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  9. MySQL中的char和varchar类型

    文章目录 1 MySQL中的char和varchar类型 1 MySQL中的char和varchar类型 CHAR类型和VARCHAR类型都在创建表时指定了最大长度,其基本形式如下: 字符串类型(M) ...

最新文章

  1. 一款美轮美奂的JavaScript 小项目
  2. 高并发之并发容器,了解多少(从入门到超神)
  3. nginx 上传文件漏洞_nginx爆惊天漏洞 上传图片就能入侵服务器
  4. 寻找两个正序数组的中位数Python解法
  5. mysql映射文件_Mybatis SQL映射文件
  6. 1-docker 介绍
  7. python可以做仿真吗agent_python agent应用
  8. 春节期间新闻回顾:思科微软多事 熊猫烧香完事
  9. 机械振动学|单自由度系统
  10. win7如何显示文件扩展名?
  11. 一位高速交警的救命忠告!常跑高速的一定要看!
  12. 第三单元 用python学习微积分(二十二)功、平均值、概率(下)和 数值积分(1)
  13. http请求头中Referer的含义和作用
  14. NSFC 申请不中的反思 (内部讨论)
  15. Linux 故障排查-测试网络端口连通性
  16. C++文件读取的四种方式
  17. 面试题:Commonjs 和 Es Module区别
  18. Sequence operation HDU - 3397
  19. 辰光融信全面推出基于可信计算3.0技术的安全增强型打印机
  20. 全程干货,用 python 下载某站全部【免抠图片】,图片背景透明,格式PNG

热门文章

  1. 23.2.3 高速缓存依赖性(1)
  2. Day14作业 二、有两个List集合怎么取两个无重复的并集
  3. [Python人工智能] 二十七.基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建
  4. Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )
  5. Python之30秒就能学会的漂亮短程序代码
  6. 718. Maximum Length of Repeated Subarray 最长重复子数组
  7. 大数据WEB阶段(十三)JSP(一)JSP基础、JSP指令详解、四大域九大隐式对象总结
  8. mybatis应用(二)注解的实现
  9. 将桌面文件复制到/etc目录
  10. 安装了ros后Python3 调用import cv2报错解决办法: