MySQL数据库中CHAR和VARCHAR之争

 2024-01-28 04:01:22  阅读 0

【IT168点评】数据库中,字符数据量最大,占整个数据库的80%以上。 为此,正确处理字符数据对于提高数据库的性能有着很大的作用。 在字符数据中,最常用的两种类型是 Char 和 。 前者是定长的,后者是变长的。 现在我们需要考虑的是,什么情况下应该使用Char字符数据,什么情况下应该使用字符数据。 这一部分,我将和大家讨论这个话题。

1.与CHAR字符数据的区别

在MySQL数据库中,最常用的字符数据类型是Char。 和查尔。 虽然这两种数据类型都用来存储字符数据,但是它们在结构和数据存储方式上有很大的不同。 而其具体实现方式还取决于存储引擎。 这里我就以最常用的存储引擎为例来谈谈这两种数据类型的区别。 后续建议也适用于这种存储类型。

这里首先要明白的是,这两种数据类型,无论采用哪种存储方式,系统存储数据的方式都是不同的。 也正是因为如此,我们才有必要研究两者的差异。 然后在适当的情况下使用适当的方法。 了解了这一点之后,我们再来看后续的内容。

通常用于存储可变长度字符串。 简单来说,我们只是固定了一个最大值,然后系统会根据实际存储的数据量来分配合适的存储空间。 因此,与CHAR字符数据相比,它可以比定长类型占用更少的存储空间。 但在实际工作中,由于某个部门的特殊原因,这里会设置例外。 例如,管理员可以根据需要指定=FIXED 选项。 当您使用此选项创建表时,系统为每行使用固定长度的空间。 这将导致存储空间的损失。 通常,数据类型可以节省磁盘空间,因此它们通常被认为可以提高数据库性能。 然而,这里应该指出的是,这往往是一把双刃剑。 虽然它可以提高性能,但通常会产生一些副作用。 由于它的长度是可变的,这可能会在数据更新时造成一些额外的工作。 比如改变之前,字符长度为10位(假设指定的最大字符数为50位),那么系统只会为其分配10个存储位置(假设不考虑系统自身的开销) 。 更改后,其数据大小达到了20位。 由于没有超过50位的最大限制,数据库仍然允许存储它。 只是它原来的存储地点已经不能满足它的存储需求了。 这时,系统需要执行额外的操作。 例如,根据存储引擎的不同,有的会使用拆分机制,有的会使用分页机制。

CHAR 数据类型与 CHAR 数据类型的不同之处在于它采用固定长度的存储方式。 简单来说,系统总是给它分配最大的存储空间。 保存数据时,即使没有达到最大长度,系统也会为其分配这么多的存储空间。 显然,这种存储方式会造成磁盘空间的浪费。 这里需要提醒大家的一件事是,当字符数不足时,系统不会用空格填充。 相反,如果保存时CHAR值后面有空值,系统会自动过滤空格。 进行数据比较时,系统会在字符串末尾补​​空格。

显然,CHAR这两种字符数据类型相比,最大的区别就是前者是变长,而后者是定长。 存储时,前者会根据实际存储的数据分配最终的存储空间。 后者按照CHAR指定的长度分配存储空间,而不管存储数据的实际长度。 这是否意味着 CHAR 数据类型不如 CHAR? 它不是。 否则,就不需要 CHAR 字符类型。 虽然数据类型可以节省存储空间,提高数据处理效率。 然而,其可变长度带来的一些负面影响有时会抵消其优点。 为此,在某些情况下,仍然需要使用Char数据类型。

2、项目建议

根据上面的分析,我们知道数据类型是一把双刃剑。 在带来性能提升的同时,也可能会带来一些额外的消耗。 当我们评估是使用该数据类型还是CHAR数据类型时,我们需要进行权衡。 在实际项目中,我们会考虑以下几种情况。

一是根据字符的长度来判断。 例如,某个字段(例如人名)具有最大长度限制。 例如,我们可以为其分配18个字符。 这时,虽然每个人的名字长度可能不同,但即使给它分配定长字符类型,即18个字符长度,最终浪费的空间也不是很大。 如果使用某种数据类型,如果以后需要更改名称,而原有的存储空间不足以容纳新的值,就会造成一些额外的工作。 这种情况下,均衡时,认为使用CHAR定长数据类型比较好。 在实际项目中,如果某个字段的字符长度比较短,一般会采用固定的字符长度。

其次是考虑它们的长度是否相似。 虽然某个字段的长度比较长,但是它的长度总是近似的,比如一般在90到100个字符之间,甚至是相同的长度。 这时候,使用CHAR字符类型就比较合适了。 一个典型的应用就是MD5哈希值。 当使用MD5哈希值存储用户密码时,CHAR字符类型非常有用。 因为它们的长度是一样的。 另外,对于存储用户ID号等,一般建议使用CHAR类型数据。

另外请考虑一个问题,CHAR(1)和(1)的定义有什么区别? 虽然它们都只能用来保存单个字符,但它们比CHAR多占用一个存储位置。 这主要是因为在使用数据类型时,多使用了一个字节来存储长度信息。 CHAR 字符类型没有管理开销。

三是从碎片化角度考虑。 使用CHAR字符类型时,存储空间分配一次。 为此,将某个字段的内容存储在一起。 单从这个角度来说,不存在碎片化的问题。 变长字符数据类型具有可变的存储长度。 当变更前后的数据长度不一致时,必然会出现碎片问题。 因此,当使用变长字符数据时,数据库管理员必须时常对其进行碎片整理。 例如,执行数据库导出和导入操作以消除碎片。

第四,即使使用数据类型,也不能太大方。 这是什么意思? 例如,现在用户需要存储一个地址信息。 根据评估,只需使用 100 个字符就可以了。 但有些数据库管理员认为数据类型无论如何都是根据实际需要来分配长度的。 不妨给它一个更大的。 因此他们可能会一次性为该字段分配200个字符的存储空间。 (100)真的和(200)一样吗? 结果是否定的。 虽然它们都是用来存储90个字符的数据,但是它们的存储空间是相同的。 但内存消耗不同。 对于数据类型来说,虽然硬盘上的存储空间是根据实际的字符长度来分配的,但是对于内存来说,情况并非如此。 固定大小的内存块用于保存该值。 简单来说,就是使用字符类型中定义的长度,即200个字符空格。 显然,这会对排序或者临时表(这些内容需要在内存中实现)操作产生比较大的不利影响。 所以如果有些字段会涉及到文件排序或者基于磁盘的临时表,那么在分配数据类型的时候还是不能太过慷慨。 还是需要评估实际需要的长度,然后选择最长的字段来设置字符长度。 如果要考虑冗余,可以保留10%左右的字符长度。 你千万不要以为它是按照实际长度分配存储空间,而是任意分配长度,或者干脆使用最大字符长度。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码