目录

varchar

char

VARCHAR(5)与VARCHAR(200)的区别

总结


varchar

VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费空间。

VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latin1字符集,一个VARCHAR(10)的列需要11个字节的存储空间。VARCHAR(1000)的列则需要1002个字节,因为需要2个字节存储长度信息。

VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。其他一些存储引擎也许从不在原数据位置更新数据。

下面这些情况下适用VARCHAR是合适的:

  • 字符串列的最大长度比平均长度大很多
  • 列的更新很少,所以碎片不是问题
  • 使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储

char

CHAR类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格。CHAR值会根据需要采用空格进行填充以方便比较。例如插入"string "存储时会是"string"

CHAR适合存储很短的字符串,或者所有值都接近同一个长度。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。

VARCHAR(5)与VARCHAR(200)的区别

我们倘若用VARCHAR(5)和VARCHAR(200)来存储'hello',我们知道这两者的空间开销是一样的。那么我们可以让VARCHAR的长度始终保持很大吗?使用更短的列有什么优势吗?

事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。

所以最好的策略是只分配真正需要的空间。

总结

当我们为字符串类型的字段选取类型的时候,判断该选取VARCHAR还是CHAR,我们可以从以下几个方面来考虑:

  • 该字段数据集的平均长度与最大长度是否相差很小,若相差很小优先考虑CHAR类型,反之,考虑VARCHAR类型。
  • 若字段存储的是MD5后的哈希值,或一些定长的值,优先选取CHAR类型。
  • 若字段经常需要更新,则优先考虑CHAR类型,由于CHAR类型为定长,因此不容易产生碎片。
  • 对于字段值存储很小的信息,如性别等,优先选取CHAR类型,因为VARCHAR类型会占用额外的字节保存字符串长度信息。

总之一句话,当我们能够选取CHAR类型的时候,或者说空间消耗相对并不是影响因素的重点时,尽量选取CHAR类型,因为在其他方面,CHAR类型都有着或多或少的优势。而当空间消耗成为了很大的影响因素以后,我们则考虑使用VARCHAR类型。

VARCHAR和CHAR类型使用场景相关推荐

  1. MySQL varchar和char类型

    varchar和char是两种最主要的字符串类型.不幸的是,很难精确地解释这些值是怎么储存在磁盘和内存中的,因为这根存储引擎的具体实现有关.下面的描述假设使用的存储引擎是InnoDB或者MyISAM. ...

  2. mysql 中varchar_MYSQL中VARCHAR和CHAR类型

    存储引擎存储CHAR或者VARCHAR值的方式在内存中和在磁盘上可能不一样,所以MYSQL服务器从存储引擎读出的值可能需要转换为另一种存储格式 VARCHARvarchar类型用于存储可变长字符串.比 ...

  3. MySQL数据库中如何选择VARCHAR和CHAR类型

    首先,VARCHAR和CHAR是两种最主要的字符串类型.在设计用于存储字符串的表字段时,可能会对到底选哪个类型有所犹豫,确实如果不了解它们之间的区别,选择上是不会那么容易,本篇将详细介绍它们之间的区别 ...

  4. MySQL——VARCHAR和CHAR类型

    前述 VARCHAR和CHAR是两种最主要的字符串类型.不幸的是,很难精确地解释这些值是怎么存储在磁盘和内存中的,因为这跟存储引擎的具体实现有关.下面的描述假设使用的存储引擎是InnoDB和/或者My ...

  5. mysql的char占几个字节_mysql varchar和char类型在不同字符集下的字符数和字节数计算...

    场景一:CHAR(30)的最大字符数和最大字节数计算 1.CHAR(30)在UTF-8字符集下计算最大字符数和最大字节数 (product)root@localhost [test]> show ...

  6. mysql的char和varchar_MySQL中CHAR和VARCHAR的区别及应用场景

    VARCHAR和CHAR是两种最主要的字符串类型.它们的存储方式和数据检索方式都不一样. VARCHAR和CHAR的数据检索效率:CHAR > VARCHAR VARCHAR类型 VARCHAR ...

  7. 数据库中的字段varchar类型和char类型的区别?

    数据库中的字段varchar类型和char类型的区别? 目录 数据库中的字段varchar类型和char类型的区别?

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

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

  9. char类型与varchar类型的区别

    char类型:定长字符串,char(n),n的范围:0-255个字符 char类型之所以叫定长字符串,是因为一旦确定了n的最大字符数,不管存的数据是多少,该数据占用的空间就是n个字符.例如:name ...

最新文章

  1. 趣谈深度学习核心----激活函数
  2. JAVA必备——13个核心规范
  3. Android开发之Handler和Looper的关系
  4. layui如何获取父节点的父节点_jquery获取父元素或父节点的方法
  5. Selenium Webdriver概述(转)
  6. java 下拉框带搜索功能_java简单的实现搜索框的下拉显示相关搜索功能
  7. 北航机试 16逆序数
  8. 配电室配套设施轨道巡检机器人及辅助监控系统
  9. 华东师范大学计算机考研资料汇总
  10. Java GC G1 详解
  11. 股票学习-量柱和k线-第一天
  12. HBuilder webApp开发(十)在线差异化升级
  13. mysql主从配置duxi_mysql 主从配置笔记
  14. 关于ASCII码和ANSI码,以下说法不正确的是()?
  15. 【1044】判断是否为两位数
  16. 如何定位Unity死循环导致的完全卡死
  17. 错误代码: 1100 Table 't_depart_info' was not locked with LOCK TABLES
  18. 阿里云 mysql emoji_如何在 MySQL 中存储 emoji ?
  19. 计算机硬盘里的文件怎么拷出来,电脑坏了怎么把硬盘里的东西弄出来
  20. C#.net将Word转PDF

热门文章

  1. JSF 源代码赏析之Lifecycle
  2. SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口
  3. Java8基础之反射
  4. TypeError: CleanWebpackPlugin is not a constructor
  5. 背水一战 Windows 10 (41) - 控件(导航类): Frame
  6. 8分钟回顾开源巨头 Facebook 的 2016
  7. ERROR 1130: Host '192.168.1.3' is not allowed to c
  8. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区...
  9. python通信编程_python 通信编程
  10. mysql noinstall 5.5_安装配置MYSQL5.5