服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL中varchar和char类型的区别

MySQL中varchar和char类型的区别

2021-12-06 19:15满丶怀 Mysql

VARCHAR和CHAR是两种最主要的字符串类型。那么MySQL中varchar和char类型的区别是什么,本文就具体来介绍一下,感兴趣的可以了解一下

前述

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)字段的表,并且往里面插入一些值:

?
1
2
3
4
5
6
7
8
9
10
create table char_test
(
    char_col char(10)
);
 
insert into char_test
values
    ('string1').
    ('  string2').
    ('string3  ');

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

?
1
2
select concat("'", char_col, "'")
from char_test;

MySQL中varchar和char类型的区别

 

执行结果

 

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

 

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表进行排序时也同样糟糕。

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

总结

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

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

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

到此这篇关于mysql中varchar和char类型的区别的文章就介绍到这了,更多相关mysql varchar和char类型内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_42570248/article/details/89786882

延伸 · 阅读

精彩推荐
  • Mysqlmysql 不能插入中文问题

    mysql 不能插入中文问题

    当向mysql5.5插入中文时,会出现类似错误 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

    MYSQL教程网5722019-11-25
  • Mysql浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参...

    小码农叔叔5242021-11-16
  • Mysql解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Veir_dev5592019-06-25
  • MysqlMySQL锁的知识点总结

    MySQL锁的知识点总结

    在本篇文章里小编给大家整理了关于MySQL锁的知识点总结以及实例内容,需要的朋友们学习下。...

    别人放弃我坚持吖4362020-12-14
  • Mysql详解MySQL中的分组查询与连接查询语句

    详解MySQL中的分组查询与连接查询语句

    这篇文章主要介绍了MySQL中的分组查询与连接查询语句,同时还介绍了一些统计函数的用法,需要的朋友可以参考下 ...

    GALAXY_ZMY5442020-06-03
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4192019-11-23
  • MysqlMySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    逆心2972019-06-23
  • MysqlERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 2 ...

    MYSQL教程网6412020-03-13