当前位置: 首页 > 面试题库 >

对所有基于文本的字段使用通用varchar(255)有不利之处吗?

穆浩皛
2023-03-14
问题内容

我有一个contacts包含字段,如表postcodefirst namelast nametowncountryphone number等等,所有这些都被定义为VARCHAR(255)即使没有这些领域都不会接近有255个字符。(如果您想知道,那就是这种方式,因为Ruby
on Rails迁移VARCHAR(255)默认将String字段映射到String字段,而我从不费心重写它)。

由于VARCHAR将仅存储字段的实际字符数(以及字段长度),因此,使用VARCHAR(16)over
相比有什么明显的优势(性能或其他方面)VARCHAR(255)

此外,这些字段中的大多数都有索引。字段上较大的VARCHAR大小是否会完全影响索引的大小或性能?

仅供参考,我正在使用MySQL 5。


问题答案:

在存储中,VARCHAR(255)它足够聪明,可以仅存储给定行上所需的长度,而CHAR(255)后者通常会存储255个字符。

但是,由于您使用MySQL标记了此问题,因此我将提到一个MySQL特定的技巧:将行从存储引擎层复制到SQL层时,VARCHAR将转换字段CHAR以获得利用固定宽度行的优势。因此,内存中的字符串将
填充到 声明的VARCHAR的最大长度

当查询隐式生成临时表时(例如在排序或时)GROUP BY,这会占用大量内存。如果您使用很多VARCHAR(255)字段来存储不需要那么长的数据,这会使临时表变得非常大。

您可能还想知道,这种“填充”行为意味着,即使您存储的是单字节内容的字符串(例如ascii或latin1字符),用utf8字符集声明的字符串也每个字符填充至三个字节。同样,utf8mb4字符集会使字符串在内存中每个字符填充到四个字节。

因此,VARCHAR(255)在utf8中,存储诸如“无意见”之类的短字符串的磁盘上需要11个字节(十个低字符集字符,再加上一个字节的长度),但是在内存中则需要765个字节,因此在临时表或排序结果中也是如此。

我曾帮助不知不觉地频繁创建1.5GB临时表并填满磁盘空间的MySQL用户。他们有很多VARCHAR(255)列,实际上存储很短的字符串。

最好根据要存储的数据类型定义列。如其他人所提到的,它具有强制执行与应用程序相关的约束的好处。但是它具有避免上面所述的内存浪费的物理好处。

当然,很难知道最长的邮政地址是什么,这就是为什么许多人选择的长度VARCHAR肯定比任何地址都要长的原因。通常使用255,因为它是a的最大长度VARCHAR,该长度可以用一个字节编码。它也是VARCHARMySQL早于5.0
的最大长度。



 类似资料:
  • 问题内容: 我已经阅读了很多有关准备好的语句的信息,并且在阅读的所有内容中,没有人谈论使用它们的弊端。因此,我想知道是否有人们容易忽视的“有龙”斑点? 问题答案: Prepared语句只是一个经过解析和预编译的语句,它仅等待提供绑定变量的执行。 任何执行的语句迟早都会准备(需要解析,优化,编译然后执行)。 一条准备好的语句只是重用了解析,优化和编译的结果。 通常,即使您自己不使用准备好的查询,数据

  • 如果我有一个这样的对象: 如何将C以外的所有键/值复制到新对象? 下划线具有<code>_。pick()功能,但我希望做相反的事情。

  • 问题内容: 是否可以将SQL Server 2008数据库中的列类型从更改为,而不必删除表并重新创建? 每当我尝试使用SQL Server Management Studio进行操作时,SQL Server Management Studio都会向我抛出一个错误-但是让我头疼的是,很高兴知道我是否可以更改类型而不必删除和创建。 谢谢 问题答案: 您应该能够使用TSQL做到这一点。 就像是

  • 我正在尝试使用为数独9x9使用。 我在这个领域是个新手,所以我想在继续之前问问你们。 我已经创建了一个9x9,现在我在每个节点中使用来显示数字,并允许用户自己编写一个新的数字。 我的问题: 是否可以用纯java代码创建81,或者是否有一种方法可以使用FXML高效地创建,这样我就不会拆分视图(模型视图控制器)设置? 提前谢谢,如果我的问题不清楚,我很难解释清楚。

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能的重复: 对所有基于文本的字段使用通用varchar(255)有不利之处吗? 在MYSQL中,您可以为VARCHAR字段类型选择一个长度。可能的值为1-255。 但是,如果使用最大值而不是VARCHAR(20)的VARCHAR(255),它的优点是什么?据我所知,条目的大小仅取决于插入字符串的实际长度。 大小(字节)=长度+1 因此,如

  • 所以,在JavaFX上切齿,到目前为止一切进展顺利。 然而,所有文本字段都有一条横跨它们的线,从顶部算起大约10px。 不仅在我的应用程序中,在SceneBuilder应用程序中也是如此。 注意,我没有使用任何明确的CSS,我不知道SceneBuilder使用什么。屏幕截图来自SceneBuilder,我的屏幕看起来一样。 所以,这是基本的东西。 在Mac OS 10.9.5上 只是好奇是否还有人