MySQL中varchar和char类型的区别

作者:满丶怀 时间:2024-01-22 22:36:05 

前述

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

先看看VARCHAR和CHAR值通常在磁盘上怎么存储。请注意,存储引擎存储CHAR或者VARCHAR值的方式在内存中和在磁盘上可能不一样,所以MySQL服务器从存储引擎读出的值可能需要转换为另一种存储格式。

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适用情况

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

  • 字符串列的最大长度比平均长度大很多

  • 列的更新很少,所以碎片不是问题

  • 使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储

CHAR类型

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

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

测试

下面通过例子来具体说明CHAR与VARCHAR行为上的不同,首先,我们创建一张只有一个CHAR(10)字段的表,并且往里面插入一些值:


CREATE TABLE char_test
(
   char_col CHAR(10)
);

INSERT INTO char_test
VALUES
   ('string1').
   ('  string2').
   ('string3  ');

当我们检索这些值的时候,会发现string3末尾的空格被截断了。


SELECT CONCAT("'", char_col, "'")
FROM char_test;

MySQL中varchar和char类型的区别 

执行结果

如果用VARCHAR(10)字段存储相同的值,可以得到如下结果:


CREATE TABLE varchar_test
(
   varchar_col VARCHAR(10)
);

INSERT INTO varchar_test
VALUES
   ('string1').
   ('  string2').
   ('string3  ');

SELECT CONCAT("'", varchar_col, "'")
FROM varchar_test;

MySQL中varchar和char类型的区别 

执行结果

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

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

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

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

来源:https://blog.csdn.net/weixin_42570248/article/details/89786882

标签:MySQL,varchar,char
0
投稿

猜你喜欢

  • Golang 文件操作:删除指定的文件方式

    2024-03-28 16:39:11
  • Vue3.0中的monorepo管理模式的实现

    2024-04-28 09:24:51
  • 一个20行左右的强$代码

    2009-12-25 15:22:00
  • 解析:MySQL 数据库搜索中大小写敏感性

    2009-02-23 17:32:00
  • vue阻止页面回退的实现方法(浏览器适用)

    2024-06-07 15:24:10
  • Python 实现毫秒级淘宝抢购脚本的示例代码

    2023-05-10 19:50:10
  • SQL SERVER 日志已满的处理方法

    2010-07-31 13:32:00
  • python+opencv+selenium自动化登录邮箱并解决滑动验证的问题

    2021-10-01 07:32:18
  • python画图中文不显示问题的解决方法

    2023-05-30 14:07:09
  • python中元类用法实例

    2023-10-24 19:12:29
  • Oracle 数据表分区的策略

    2010-07-21 13:30:00
  • 在MAC OS X上安装MYSQL

    2024-01-28 17:25:46
  • python解释器pycharm安装及环境变量配置教程图文详解

    2021-10-13 22:50:44
  • Python OpenCV 使用滑动条来调整函数参数的方法

    2022-05-20 06:43:48
  • python中实现将多个print输出合成一个数组

    2022-10-27 20:00:26
  • OpenCV-Python模板匹配人眼的实例

    2022-10-22 06:09:23
  • 一篇文章看懂SQL中的开窗函数

    2024-01-16 07:22:05
  • Python使用pandas导入csv文件内容的示例代码

    2022-07-25 15:34:16
  • Django中ORM外键和表的关系详解

    2022-04-27 10:25:59
  • bootstrap-table组合表头的实现方法

    2024-05-11 09:07:53
  • asp之家 网络编程 m.aspxhome.com