zoukankan      html  css  js  c++  java
  • mysql CHAR and VARCHAR 比较

    写在前面

    面试的时候突然有一位面试官问,说说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. 主键上的填充
      如果是主键,会自动去掉字符后面的所有空格
  • 相关阅读:
    Tomcat安装(安装版)
    Selenium自动化测试(一)之环境搭建
    Windows快速启动应用高效搜索文件工具-Listary
    Python3之jsonpath使用和json转换
    Python3操作SQLite数据库
    初识面向对象
    忘记虚拟机中Linux的登录密码解决办法
    win10自带虚拟机的使用(Hyper-v)
    nigx下配置tp5.1路由
    PHP无限极菜单
  • 原文地址:https://www.cnblogs.com/wangshuyu/p/10560775.html
Copyright © 2011-2022 走看看