MySQL CHAR和VARCHAR那些事

我们知道CHAR(M)和VARCHAR(M)的区别就是VARCHAR(M)是变长的字符串,而CHAR(M)是定长的字符串。我们暂时先不考虑变长和定长的问题,我们先来看一看CHAR(M)和VARCHAR(M)中的M代表的是什么意思。

在oracle中CHAR(M)和VARCHAR(M)中的M代表的是字节数就是这个列占用的最大字节数。而在MySQL中CHAR(M)和VARCHAR(M)中的M代表的是这个列占用的最大字符数。这是什么意思呢?下面我们在MySQL中创建一张表来测试一下就明白了。

DROP TABLE IF EXISTS `char_test`;
CREATE TABLE `char_test` (
  `ch` char(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

char_test表非常简单,只有一个字段ch,他的类型是CAHR(4),用的是utf-8编码,接下来在char_test表中插入三行数据。

图1:正常插入数据

我们用MySQL提供给我们的函数length(str),和char_length(str),来查看表char_test中的ch字段的字节数和字符数如下:

图2:字节数和字符数

因为是用utf-8编码,utf-8编码中一个英文字符占用1个字节,一个汉字占用3个字节。所以我们看到hi占用的是2个字节,2个字符。非常高兴占用了12个字节,4给字符。所以我们可以知道CHAR(M)中的M是表示最大占用的字符数。如下图3面我们来试一试插入多一点字符的情况。

图3:非正常插入

您好tim总共有5个字符,插入就出错了,这是在STRICT_TRANS_TABLES模式下,直接报错了。

VARCHAR(M)和CHAR(M)的情况一样,M也是表示最大的字符数。只是和很多资料上的情况不一样的是VARCHAR(M)中的M取值范围并不是固定的0~65535,而是根据编码不同有所不同。

图4:使用ascii编码

图5:使用默认的utf-8编码

如上图4、5所示,当使用ascii编码的时候,M的取值是0~65535,当使用utf-8编码是时候M的取值范围是0~21845。

图6:VARCHAR(M)官方文档

因为MySQL的官方文档对于VARCHAR的介绍是最大是65535给字节,而utf-8占用的是1~6个字节。而21845*3 = 65535,所以我们也只能猜测在中文环境中MySQL只支持占用3个字节的汉字,因为汉字大多数占3个字节。这样就算是21845个字符全部是汉子都刚好占用65535个字节。

接下来的事情就是,考虑定长和变长的事了。这其实和功能没有太大的关系了,主要是存储和使用效率有关了。

CHAR(M)是定长的,顾名思义就是长度是固定的,这里的长度是指底层存储空间的字节数。例如CHAR(4),根据编码不同MySQL为CHAR(4)分配的就是固定的字节数的存储空间,不管你放‘hi’还是‘非常高兴’,底层都是占用4个字符所占用的字节。不够怎么办?没关系,填充空格。至于查询的时候只要不是PAD_CHAR_TO_FULL_LENGTH模式下,就会把CHAR(M)类型末尾的空格去掉。

VARCHAR(M)是变长的,顾名思义就是长度是可变的,例如:VARCHAR(4),虽然最大的字符数是4但是我如果只存放一个hi,底层就只占用2个字符所占用的字节。

那么问题来了,我们该怎样选择CHAR(M)和VARCHAR(M)呢?这其实是一个比较复杂的问题,考虑到不同的场景和不同的存储引擎,选择是不同的。

如果您对性能没有什么要求,并且也不太想花时间去分析思考这些数据的应用场景,数据的查询和索引效率等的关系,那么直接用VARCHAR(M)吧。

如果您对性能有要求,那么您就可以考虑一下是否对数据进行一些约束,限制一下数据的长度,做一下合理的转换,特别是对一些经常索引和查询的数据。例如:有一张用户表,包含name,address,phone,password等属性。也许就可以把name设置成CHAR类型的因为name显然是经常查询的字段,并且长度比较固定。姓名嘛,一般就是2-4个字符嘛,就算设置大一点,也算是用空间换时间,address看具体的情况,phone没什么说的固定的CHAR(11)一点都不浪费,不要为了怕出错弄一个CHAR(20)这样的类型,因为手机号码有非常明显的数据约束,就算是错误,也是客户端的错误。至于password完全可以考虑学习一下MySQL的做法,直接弄一个CHAR(40),然后用sha1(password)加密在存放。不仅效率高,还很保证了数据的安全性。

时间: 2024-12-17 11:54:06

MySQL CHAR和VARCHAR那些事的相关文章

mysql char与varchar区别

CHAR 和VARCHAR 类型类似,都用来存储字符串,但它们保存和检索的方式不同. CHAR属于固定长度的字符类型,而VARCHAR 属于可变长度的字符类型. mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));mysql> INSERT INTO vc VALUES ('ab ', 'ab ');mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;+----------------+-

MySQL char、varchar、text区别

原文链接:https://blog.csdn.net/brycegao321/article/details/78038272 https://blog.51cto.com/arthur376/2121160 1. char长度固定, 即每条数据占用等长字节空间:适合用在身份证号码.手机号码等定. 2. varchar可变长度,可以设置最大长度:适合用在长度可变的属性. 3. text不设置长度, 当不知道属性的最大长度时,适合用text. 按照查询速度: char最快, varchar次之,t

mysql char varchar 二三事

mysql char和varchar很类似. char最大长度为255,存入不够255个字符时,右边补充spaces填充. varchar最大长度为65535. varchar(n)比char(n)多一个或两个字节,用来确定varchar value的长度.当value不超过255个字符,额外的一个字节即可.value超过255个字符时,需要2个字节. 查询效率对比:因为varchar需要根据额外的字节定位value的长度,所以要比char速度慢. row包含varchar和char的情形 查询

MySql之char与varchar

MySql之char与varchar的区别 char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是: 1. char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉) 在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节). 2.char的效率比varchar2的效率稍高. 3.目前varchar是varch

MYSQL, char 与 varchar的区别!

一.char 和 varchar 的区别: 1)取值范围: char:取值范围:0~255 varchar:取值范围:0~65535 2)空间占用与速度: char: 定长字符串,占用空间大,速度快,一般用于固定长度的表单提交数据存储,例如:身份账号.电话号码.密码等 varchar:变长字符串,占用空间小,速度慢 3)存储与检索数据: char:存储的数据是否达到了给定值得字节,都要占用给定值大小的空间,不足的自动用空格填充,在检索时后面的空格会被自动去裁剪掉. 如:定义  tel char(

Mysql中的char与varchar length()与char_length()

在mysql中,char和varchar都表示字符串类型.但他们存储和检索数据的方式并不相同. 在表结构定义中声明char和varchar类型时,必须指定字符串的长度.也就是该列所能存储多少个字符(不是字节,是字符).例如:char(10)和varchar(10)都能存储10个字符. 声明为char的列长度是固定的,char的长度可选范围在0-255之间.也就是char最大能存储255个字符.如果该列是utf8编码,则该列所占用的字节数=字符数*3.如果是gbk编码则该列所占用的字节数=字符数*

MySQL中char和varchar有啥区别?优缺点是啥?

在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符: varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13字符:从上面可以看得出来char 长度是固定的,不管你存储的数据是多少他都会都固定的长度.而varchar则处可变长度但他要在总长

mysql数据类型之char和varchar类型

在mysql数据库系统中,char和varchar是非常常见的,它们两个也非常的相似,都是用来保存相对较短的字符串,如保存文章标题.留言.email.用户名等.二者的主要区别在于存储方式: char列长度是创建表时声明的长度而且固定不变,长度被限制在0到255之间.一般在数据库设计时,用户保存密码.姓名.IP信息时,由于基本长度都有所固定,用此类型比较合适. varchar列中的值是可变长度字符串,长度也为0-255,在5.0.3之后长度延长到65535. 在查询显示数据的时候,char会删除字

MySQL中的char与varchar详解

mysql中char与varchar的区别: char:定长,效率高,一般用于固定长度的表单提交数据存储  :例如:身份证号,手机号,电话,密码等 varchar:不定长,效率偏低 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定).在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去