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虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(4)   | YES  |     | NULL    |                |
| addr  | char(8)      | YES  |     | NULL    |                |
| bn    | varbinary(4) | YES  |     | NULL    |                |
| b     | binary(8)    | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
+----------------------+----------------------+
| concat("$",name,"$") | concat("$",addr,"$") |
+----------------------+----------------------+
| $asdf$               | $a$                  |
| $asdf$               | $a$                  |
| $a $                 | $a$                  |
| $a$                  | $a$                  |
| $t a$                | $a$                  |
+----------------------+----------------------+
mysql> select * from zcy where name='a ';   //由于name是varchar,比较时,'a '自动转换为'a'

+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  3 | a    | a    | ab   | ab       |
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+
2 rows in set (0.00 sec)

mysql> select * from zcy where name='a';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  3 | a    | a    | ab   | ab       |
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+
2 rows in set (0.00 sec)

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(4)   | YES  |     | NULL    |                |
| addr  | char(8)      | YES  |     | NULL    |                |
| bn    | varbinary(4) | YES  |     | NULL    |                |
| b     | binary(8)    | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
+--------------------+-------------------+
| concat("$",bn,"$") | concat("$",b,"$") |
+--------------------+-------------------+
| $ab a$             | NULL              |
| $ab $              | $ab      $        |
| $ab$               | $ab      $        |
| $ab  $             | $a       $        |
| NULL               | $a       $        |
| NULL               | $abcde   $        |
| NULL               | $abcd1234$        |
+--------------------+-------------------+

binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制
binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节
进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速
按字符比较不区分大小写,而binary区分大小写,结尾使用\0填充,而不是空格
mysql> select * from zcy where b='a\0\0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  5 | t a  | a    | NULL | a        |
+----+------+------+------+----------+
mysql> select * from zcy where b='a \0\0\0\0\0\0'; 
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+

varbinary保存变长的字符串,后面不会补\0
mysql> select * from zcy where bn='ab';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  3 | a    | a    | ab   | ab       |
+----+------+------+------+----------+
1 row in set (0.01 sec)

mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  2 | asdf | a    | ab   | ab       |
+----+------+------+------+----------+
1 row in set (0.00 sec)

mysql> select * from zcy where bn='ab  ';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+
1 row in set (0.00 sec)

char、varchar、binary和varbinary的区别与联系相关推荐

  1. mysql binary blob区别_SQL中binary 和 varbinary的区别 blob

    binary 和 varbinary 固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型. binary [ ( n ) ] 固定长度的 n 个字节二进制数据 ...

  2. oracle中varchar 和 nvarchar2的区别,Oracle中char,varchar,varchar2,nvarchar,nvarchar2的区别

    一.概述 1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节: char是区分中英文 ...

  3. SQL中binary 和 varbinary的区别

    binary 和 varbinary 固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型. binary [ ( n ) ] 固定长度的 n 个字节二进制数据 ...

  4. SQL中char varchar nchar nvarchar ntext区别和使用(资料汇总)

    SQL中char varchar nchar nvarchar ntext区别和使用(资料汇总) 2008年10月14日 星期二 23:57 一.SQL中char varchar nchar nvar ...

  5. mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...

    一.char 和 varchar 区别 1.定长和变成 char:定长,长度固定:varchar:变长,长度可变: 当插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存 ...

  6. 数据库:CHAR,VARCHAR,TEXT,ENUM ,SET,BINARY,VARBINARY 列的完整性约束

    数据库 CHAR类型和VARCHAR类型 TEXT类型 ENUM 和SET类型 SET类型 二进制类型 BINARY和VARBINARY类型 BIT类型 列的完整性约束 CHAR类型和VARCHAR类 ...

  7. BINARY和VARBINARY类型的区别

    BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串.也就是说,它们包含字节字符串而不是字符字符串.这说明它们没有字符集,并且排序和比较基 ...

  8. 数据库中char varchar nchar nvarchar的区别

    数据库中char varchar nchar nvarchar的区别 我们在进行数据库的设计的时候,很多情况下表中的字段都是用的是字符串类型的数据,其中就有四种选择char varchar nchar ...

  9. SqlServer中char,varchar,nchar,nvarchar的区别

    在数据库中建表时,总是习惯的将一些字段定义为nvarchar,但关于它和nchar的区别,却没有细究过,今天上网仔细了解一下做个总结: 1.n代表的是Unicode字符,可以解决多语言字符集之间的转换 ...

最新文章

  1. float gpu 加速_tensorflow - GPU 加速
  2. 多线程编程之二——MFC中的多线程开发
  3. Java 面试题 —— 老田的蚂蚁金服面试经历
  4. 多任务实现-协程(python 版)
  5. jsp用户登录验证_Java之使用过滤器进行登录验证
  6. python飞机大战游戏高级_05.python实现飞机大战游戏
  7. 2021,我的年终总结......
  8. 基于关系域演算的QBE语言
  9. 从0到1搭建RPC框架
  10. SpringBoot 2.0.0 注入SpingCloud 有bug(目前只有SpringBoot 1.5+ 版本的支持)
  11. 出现Please make sure you have the correct access rights and the repository exists.问题解决
  12. Excel批量复制选中单元格的整行
  13. 了解计算机软件系统教学设计,认识计算机教学设计及反思
  14. 学会阅读源码后,我觉得自己better了
  15. Twitter教程:如何下载Twitter数据副本?
  16. 微信小程序获取input输入框的值
  17. 打造地图拼接利器(六)GMap.net内动态显示和更新经纬网络
  18. 获取网站后台权限理解
  19. win11 / win10 彻底删除系统“快速访问”中自动添加的文件夹 - 不再自动添加
  20. 生存资料决策曲线分析DCA

热门文章

  1. java list 比较_Java中List的五种去重方法及效率对比,你都用对了吗?
  2. python小屋_Python小屋——Python语言基础(三)
  3. pg高性能服务器,如何充分利用单台服务器的性能将10亿级的json数据尽可能高效的插入postgresql?...
  4. 批处理中setlocal enabledelayedexpansion的作用详细整理
  5. MySQL 数据库常用存储引擎的特点
  6. jira在linux下面的安装和配置
  7. C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)
  8. SharePoint 2010应用开发系列
  9. C# API强制关机、重启以及注销计算机
  10. 图像相似度算法的C#实现及测评