写在前面

面试的时候突然有一位面试官问,说说CHAR和VARCHAR的区别,懵逼了,想自己平常使用的时候直接把VARCHAR拿来就用,真没注意到其中的不同。

反思,为什么没有注意到他们的不同

  1. 对于mysql知识体系建立的不完备,借用《如何高效学习》里面提到的观点是:

mysql这座城市里,建立的高速公路不够完备,所有的知识体系之间没有建立关联关系。这也是问到其中的知识一脸懵逼的原因。

  1. 平常使用时候,没有多问“为什么”,为什么我们使用VARCHAR而不是使用CHAR,使用VARCHAR仅仅是为了存储字符串吗,那么为什么不使用CHAR呢?借用《如何构建亿级流量架构》里的一句话:

任何事物都没有表面看起来那么简单。

  1. 我所认为的理所当然的事情真的是理所当然的吗?

CHAR and VARCHAR 不同

那么如何解决这个问题,我们可以从哪些方面去解决这个问题?先自己想一想,然后再去Google。

  • 有设计了两个字段,那么这两个字段的意义坑定是不一样的(废话 _),那么最明显的就是长度的不同。
  • 如果只是长度的不同,没必要再来一个类型吧,(恩恩,有道理喔)
  • 那我们去google一下吧
  1. 先来一个stack overflow的回答

直接贴出来,省的去打开地址

VARCHAR is variable-length.

CHAR is fixed length.

If your content is a fixed size, you'll get better performance with CHAR.

写的很简洁了,不过我想知道的更多,那怎么办呢?-- 看文档

  1. 再多一点

See the MySQL page on CHAR and VARCHAR Types,看人家官方就知道我们会提这个问题,已经准备了详细的介绍。

先来一个表说明二者的不同

  • VARCHAR存储的时候不会填充;CHAR存储的时候会进行填充,相应的在检索的时候会自动去掉空格(也就是如果where CHAR类型的数据是没有空格的),也就是说,我们如果我们insert的数据想要保留空格,那么不要使用CHAR存储
  • VARCHAR只存储了ab为什么是3个字节?abcd为什么是5个字节?而CHAR就没有这种情况,多出来的是什么原因?

    官方介绍,VARCHAR值存储的时候是 长度前缀+数据,长度前缀为1字节或2字节,如果值不超过255个字节,那么长度是1字节(2的8次方),如果长度超过255个字节,那么长度就是2个字节

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec) mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 row in set (0.06 sec)
  1. 长度的不同
  • CHAR的长度是0-255(2的8次方)之间
  • VARHCAR的长度是0-65,535(2的16次方)之间
  1. 主键上的填充

    如果是主键,会自动去掉字符后面的所有空格

mysql CHAR and VARCHAR 比较的更多相关文章

  1. MySQL char与varchar的差异

    字符与字节的区别 一个字符由于所使用的字符集的不同,会并存储在一个或多个字节中,所以一个字符占用多少个字节取决于所使用的字符集 注意:char与varchar后面接的数据大小为存储的字符数,而不是字节 ...

  2. MYSQL—— char 与 varchar的区别!

    一.char 和 varchar 的区别: 1)取值范围: char:取值范围:0~255 varchar:取值范围:0~65535 2)空间占用与速度: char: 定长字符串,占用空间大,速度快, ...

  3. Mysql Char 和 Varchar的区别

    CHAR和VARCHAR都是字符串类型,它们的具体区别为: 长度大小区别: CHAR(M)定义的列的长度为固定的,M取值可以为0-255之间: VARCHAR(M)定义的列的长度为可变长,M取值可以为 ...

  4. MySQL char与varchar 的区别

    一.差异 1.占用存储空间上 char 初始化时占固定空间,varchar依据插入内容大小使用空间. 2.char最大字符长度255个(约0.1KB),varchar则是65535(约192KB). ...

  5. MySql之char与varchar

    MySql之char与varchar的差别 char是一种固定长度的类型,varchar则是一种可变长度的类型.它们的差别是:  1. char(M)类型的数据列里.每一个值都占用M个字节.假设某个长 ...

  6. MySQL中char、varchar和text的区别

    三者空间占用方面: char:存储定长数据很方便,CHAR字段上的索引效率极高,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填 ...

  7. mysql中char,varchar与text类型的区别和选用

    关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... 于是去查阅了一 ...

  8. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  9. mysql中char与varchar的区别

    在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下选择塔 ...

随机推荐

  1. Mybatis源码学习第八天(总结)

    源码学习到这里就要结束了; 来总结一下吧 Mybatis的总体架构 这次源码学习我们,学习了重点的模块,在这里我想说一句,源码的学习不是要所有的都学,一行一行的去学,这是错误的,我们只需要学习核心,专 ...

  2. Q200510-03-02: LRU缓存机制

    问题: LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果 ...

  3. 20190923-06Linux文件权限类 000 014

    文件属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定.在Linux ...

  4. redis锁操作

    模拟多线程触发 package com.ws.controller; import io.swagger.annotations.Api; import io.swagger.annotations. ...

  5. (课堂笔记)第三章:F5 LTM 负载均衡理论

    BIG-IP LTM负载均衡理论 ------F5 BIG-IP LTM负载均衡策略---------- 1.1 LTM VS工作模式F5 BIG-IP LTM的内部对于数据包的处理方式,即是VS的工 ...

  6. 执行./install.sh时报错-bash: ./install.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录

    百度解释说是因为这个文件在windows下编辑过,windows下每一行的结尾是\n\r, 而linux下每一行结尾是\n,所以只需要删除这个文件中的\r字符就可以了sed -i 's/\r$//' ...

  7. centos7安装PHP7的redis扩展

    前言: 在本篇博客中,我将给大家介绍如何在Centos7上安装PHP-Redis扩展,关于如何在Centos上安装redis的,可以参考另外一篇博客:Centos7安装redis 想要在php中操作r ...

  8. [剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树

    题目一 题目 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 题解 递归. 代码 class TreeNode { int v ...

  9. 现有 Vue.js 项目快速实现多语言切换的一种思路

    Web 项目多语言(i18n,即国际化)是比较常见的需求,常规的做法大概有以下几种: 每种语言单独开发页面,适用于 CMS 之类的网站 多语言文本和页面结构分离,运行时动态替换.适用于单页应用(SPA ...

  10. 【原创】一层Nginx反向代理K8S化部署实践

    目录: 1)背景介绍 2)方案分析 3)实现细节 4)监控告警 5)日志收集 6)测试 一.背景介绍     如下图所示,传统方式部署一层Nginx,随着业务扩大,维护管理变得复杂,繁琐,耗时耗力和易 ...