暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

CHAR 与 VARCHAR:有什么区别?

原创 谭磊Terry 恩墨学院 2022-09-12
584

在本文中,我们将介绍两种 MySQL 数据类型之间的异同:VARCHAR 和 CHAR。

如果您已经发现自己在 MySQL 领域有一段时间了,那么您已经知道 MySQL 和它的其他风格提供了几种数据类型供开发人员选择。MySQL 提供的大多数最流行的数据类型都与文本相关——在这个领域,MySQL 提供VARCHAR、CHAR、TINYTEXT、TEXT和其他选项。在本文中,我们将介绍两个最受欢迎的选项之间的异同:前面提到的VARCHAR和CHAR。

什么是 CHAR 和 VARCHAR?

在深入研究这两种数据类型之间的差异之前,我们必须首先让您了解它们是什么,对吧?好吧,这个空间中的一切都非常简单,因为数据类型本身的名称暗示了它们能够做什么——CHAR代表“字符值”和VARCHAR“可变字符值”。

两者CHAR和VARCHAR与其他类似数据类型的不同之处在于它们都被认为是固定长度的数据类型:我们创建两者CHAR和VARCHAR具有“固定”长度的数据类型,如果CHAR正在使用,大小范围可以从 0 到 255 个字符或从 1 到 65,535 个字符(如果VARCHAR正在使用)。我们的数据长度越大,我们的字符占用的空间就越多(这可能不会是一个很大的问题,但是,如果您的数据增长,您可能需要同时关注数据库的结构和学习如何使用大数据集),尽管这是常识。虽然有时没有被广泛讨论的是这两种数据类型之间的核心差异——毕竟,即使它们的名称相似,那有什么关系呢?当我们引导您穿越他们的世界时,请耐心等待…

CHAR 与 VARCHAR

乍一看,两者CHAR似乎VARCHAR都非常相似——毕竟,它们的定义方式完全相同,不是吗?DemoCHAR(5)将创建一个名为 demo 的列,其CHAR数据类型的长度为5,demo VARCHAR(5)并将创建一个以数据类型命名的demo列VARCHAR。

然而,当我们深入研究这些时,我们会注意到 MySQL 在其架构中隐藏了它们的差异:

CHAR VARCHAR
固定长度 可变长度
无论存储什么,总是占用相同数量的空间 占用的空间量不同:1 或 2 字节 + 数据
最多可容纳 255 个字符 最多可容纳 65,535 个字符
使用静态内存分配 使用动态内存分配language

正如您所看到的,有些差异是显而易见的,有些则不是——例如,VARCHAR由于名称,我们会暗示这是一种可变长度数据存储类型,但您知道它CHAR只能容纳 255 个字符吗?造成这种情况的原因之一可能是因为CHAR已知总是占用完全相同的存储空间 - MySQL 如何确保具有CHAR数据类型的列在包含 50,000 个字符时不会占用 5MB 的存储空间? 使用 255,这很容易做到——CHAR列的长度是在我们创建表时定义的,无论发生什么都不会改变。但是,这有其自身的缺点——我们不能存储非常大的文本值。让你想象什么CHAR可以处理,前往 Lorem Ipsum 生成器并观察段落。CHAR可以处理大约三分之一的段落 - 换句话说,四到五个句子。

image.png

我们CHAR以蓝色突出显示了可以毫无问题地处理的文本。看到问题了吗?如果我们存储非常少量的文本,这种数据类型可能是合适的,但如果我们正在使用更大规模的系统,或者即使我们需要处理几个登录表单,则不适合。(请记住,我们需要对密码进行哈希处理以使它们不可读——我们真的想冒无法存储它们的风险吗?)

简而言之,CHAR如果我们被存储空间所束缚并且不打算在我们的列中存储太多数据,那么这是一个合适的选择。
然而,这VARCHAR完全是另一回事——正如您所理解的,它是一种可变长度的数据类型,这意味着它的行可以获取高达 65,535 字节的数据大小。这种数据类型可以处理的字符数量不限于 255 个,尽管这几乎是每个开发人员在处理数据时使用的 - 请注意,VARCHAR数据类型也可以轻松容纳 6,000、10,000 个字符等,但是这一切都取决于正在使用的排序规则和字符集。(有关该主题的详细信息,请参阅文档。)

底线是——VARCHAR只要行大小不超过 65,535,我们就可以在列上创建具有数据类型的表。就那么简单。例如,如果我们有 7 列,其中 6 列的大小为 10,000 个字符,而第七列有 6,000 个字符,那么我们就有麻烦了,因为合并后的行大小将超过 65,535 - 我们将有 66,000 个。你明白了。

另外,请记住,这种数据类型在磁盘上占用的空间量从 1 到 2 个字节不等——在设计具有更大数据集的系统时请记住这一点,但除此之外,不要太担心。现代硬盘和固态驱动器根本不会造成这个问题。使用它们,你应该没问题。

最后一点CHAR与VARCHAR它为其数据CHAR分配内存的数量不同——静态分配内存意味着一旦分配了内存,它的大小就不能改变,VARCHAR反之亦然——它在运行时分配内存。

最重要的是——VARCHAR主要用于中型到大型项目,CHAR通常仅在我们规模有限或项目非常小的情况下使用。在这里牺牲几千字节,否则数据库管理员不应该担心的问题 - 磁盘空间便宜且易于获取。但是,话虽如此,请记住,如果我们正在处理更大的数据集,我们应该相应地处理数据类型的大小。除此之外,应该没有什么大问题!

原文标题:CHAR vs. VARCHAR: What’s the Difference?
原文作者:Lukas Vileikis
原文地址:https://dzone.com/articles/char-vs-varchar-whats-the-difference

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论