为啥我应该为 MySQL 中的 varchar 选择 255 以外的任何其他长度?

Posted

技术标签:

【中文标题】为啥我应该为 MySQL 中的 varchar 选择 255 以外的任何其他长度?【英文标题】:Why should I ever choose any other length than 255 for varchar in MySQL?为什么我应该为 MySQL 中的 varchar 选择 255 以外的任何其他长度? 【发布时间】:2011-03-10 20:25:11 【问题描述】:

我知道 CHAR 和 VARCHAR 的区别,

CHAR - 固定长度

VARCHAR - 可变长度(大小 + 1 个字节)

但我想知道选择 varchar 长度的目的是什么,例如VARCHAR(50)VARCHAR(100)VARCHAR(255)

这对我来说似乎毫无意义,因为实际使用的空间取决于存储在数据库中的值。

所以我的问题是:

1) 可以将我所有的 varchar 设置为 255 2) 为什么要指定其他长度?

【问题讨论】:

Are there disadvantages to using a generic varchar(255) for all text-based fields? 的可能重复项 另外,***.com/questions/1262174/… 一直认为 mysql 文档很好地解释了差异:dev.mysql.com/doc/refman/5.0/en/char.html 请注意,如果您向 varchar 列添加索引:InnoDB 索引键前缀的最大长度为 767 字节。由于 MySQL 处理 Unicode 的方式,这可以进一步减少可以存储的实际“字符”的数量……使用 utf8mb4 编码,可能低至 191。所以对于索引列varchar(191) 可能是“最安全”的最大长度.在此处查看文档:dev.mysql.com/doc/refman/8.0/en/innodb-limits.html 【参考方案1】:

摘自MySQL documentation:

CHAR 和 VARCHAR 类型相似,但它们的存储和检索方式不同。从 MySQL 5.0.3 开始,它们的最大长度以及是否保留尾随空格也有所不同。

CHAR 和 VARCHAR 类型的声明长度表示要存储的最大字符数。例如,CHAR(30) 最多可容纳 30 个字符。

CHAR 列的长度固定为您在创建表时声明的长度。长度可以是 0 到 255 之间的任何值。当存储 CHAR 值时,它们用空格右填充到指定长度。检索 CHAR 值时,将删除尾随空格。

VARCHAR 列中的值是可变长度字符串。在 MySQL 5.0.3 之前,长度可以指定为 0 到 255 之间的值,在 5.0.3 及更高版本中可以指定为 0 到 65,535 之间的值。 MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,所有列共享)和使用的字符集。

与 CHAR 相比,VARCHAR 值存储为一个字节或两个字节长度的前缀加上数据。长度前缀表示值中的字节数。如果值需要不超过 255 个字节,则一列使用一个长度字节,如果值可能需要超过 255 个字节,则使用两个长度字节。

【讨论】:

请注意引用时链接到来源。 一个小修正:链接的文档说VARCHAR MySQL >= 5.0.3 的上限为 65,535。引用:“The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.【参考方案2】:

1) 如果您不想限制存储的 varchar 的最大大小,那么可以。话说……

2) 在许多情况下,您希望设置 varchar 大小的上限。假设您正在存储一个邮件列表,并且地址行的空间有限。通过为您的地址字段设置上限,您现在允许数据库为您强制执行最大地址行长度。

【讨论】:

【参考方案3】:

1) 从技术上讲,这很好,因为在开始时创建的字段长度只有 1 或 2 个字节。之后,它们会根据需要生长。

2) 话虽如此,但良好的设计原则建议您适当设置字段长度,以便 a) 如果有人通过表格方案并试图计算出特定字段中存储了多少数据,他们可以看到某些字段将比其他人保存更少的数据,并且 b) 您可以防止数据库引擎完成少量额外工作,因为它必须在插入期间从 VARCHAR(10) 字段中截断比 VARCHAR(255) 更少的空间。

您可以在此处查看有关它的更多详细信息:

http://dev.mysql.com/doc/refman/5.0/en/char.html

【讨论】:

【参考方案4】:

我在其他地方读到,当您对使用它们定义的列运行选择时,varchar 相对于 char 会带来性能损失。所以,也许你想选择 char,如果你确定该字段总是有一定的长度,并且你有性能问题......

【讨论】:

我想查看此声明的参考资料。 很公平,我会给你一个,只是这个评论是三年多以前的,我什至不记得我在哪里看到的。【参考方案5】:

1) 是的。

2) 从历史上看,这是一个性能打击。

查看诸如 sqlite 之类的数据库,这些数据库将所有内容都存储为文本,以证明它不再重要。

【讨论】:

sqlite 并不是完全高性能的数据库 - 如果它强制行大小可变,则 varchar 会影响性能。 是的,但是对于大多数人和大多数人来说,它的速度足够快 没错,但声称它“不再”重要并将 sqlite 用作数据库工程的顶峰确实具有误导性。不,对于大多数人和大多数用途来说,它还不够快 - 它只是最容易配置并且超过成本,至少在最初......只要你从来没有来自多个用户的同时请求,就是这样。 【参考方案6】:

CHAR 与 VARCHAR

CHAR 用于固定长度大小变量。VARCHAR 用于可变长度大小变量。

例如

create table emp
(f_name CHAR(20),
 l_name VARCHAR(20)
);

insert into emp values('Suraj','Chandak');

select length(f_name), length(l_name) from emp;

Output will be

length(f_name)          Length(l_name)
   20                       7

CHAR vs VARCHAR的最佳答案

编辑

您可以设置列的最大上限。 性能和存储会产生影响。

谢谢。

【讨论】:

问题是“1)可以将我所有的 varchar 设置为 255 2)为什么要指定任何其他长度?”,而不是 CHAR 与 VARCHAR。【参考方案7】:

在对字符串进行比较时,这两种值类型之间的主要区别就体现出来了。

在预定义长度的 CHAR 列中,您必须在整个列长度中一直“运行”,而在 VARCHAR 列中,您需要在整个值长度而不是列中一直“运行”长度,在大多数情况下更快。

因此,如果存储在 VARCHAR 字段中,则比较小于字段长度的值长度会更快。

【讨论】:

【参考方案8】:

但我想知道选择 varchar 长度的目的是什么,例如VARCHAR(50)、VARCHAR(100)、VARCHAR(255)

这对我来说似乎毫无意义,因为实际使用的空间取决于存储在数据库中的值。

指定例如VARCHAR(5) 而不是 VARCHAR(500) 在某些情况下可以为您提供更好的性能,例如用于使用内存临时表的操作。

另一种情况是限制列长度以符合域要求(当您的值不应大于某个最大值时。例如:DNS 中的完整域名不得超过 253 个字符的长度)

【讨论】:

【参考方案9】:

固定长度(静态)表更快。当表中的每一列都是“固定长度”时,该表也被认为是“静态”“固定长度”。非固定长度的列类型示例有:VARCHAR、TEXT、BLOB。

http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

因此,如果您的表没有任何其他字段,即 varchar、text 或 blob;您可以使用 char 并使您的表格成为静态表格。这样他们会更快。

【讨论】:

那个答案与这里提出的问题无关。 你是对的。我不记得为什么我发布了这个答案。也许那时,我正在寻找相关的东西。也许他编辑了他的问题? 不知道,可能是。我不知道如何查看他的编辑历史,也不知道我是否有足够的声誉一开始就看到它。

以上是关于为啥我应该为 MySQL 中的 varchar 选择 255 以外的任何其他长度?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中text是啥类型?跟varchar啥区别?为啥这个数据库中text类型后面的长度是0?

mysql中 varchar(20)我的数据长度超过了,varchar不是自动增长的吗,为啥他把后面超过的内容给截了。

关于MySQL中的varchar类型的研究

为啥 CHAR 和 VARCHAR 在 MySQL 中返回相同的长度?

MySql 按 Mmm-dd-yyyy 中的(varchar)日期排序

mysql为啥说如果使用的是Innodb引擎的话,推荐使用varchar代替char