dbdemon Asked: 2019-01-15 05:47:54 +0800 CST2019-01-15 05:47:54 +0800 CST 2019-01-15 05:47:54 +0800 CST varchar 列的长度 - 使用 255 有优势吗?[复制] 772 我经常遇到这样的列varchar(255),所以大概这是一种约定。255 是 2^8 - 1。那么 2^n - 1 的长度有什么“神奇”吗?或者只是特别是255?varchar某些特定长度是否有性能或存储优化优势?还是这只是旧智慧不再适用于当前版本的 MariaDB 和 MySQL? mysql mariadb 4 个回答 Voted Best Answer Rick James 2019-01-15T09:09:27+08:002019-01-15T09:09:27+08:00 我偶尔会抱怨255。当然, “255”曾经有一些原因,但许多不再有效,甚至适得其反。 在 MySQL 中,有理由停止在 191、255、767、3071、64K 以及可能的其他值。有些依赖于 Engine,有些依赖于CHARACTER SET等。 AVARCHAR存储为 1 或 2 字节长度加上足够的字节用于您指定的任何字符集中的当前文本。然而,选择 1 或 2并不仅仅由单个列驱动;它由总行大小驱动。也就是说,这不是使用 255 的有效借口。 使用长度为 大到足以保守地永远不会被超过,然而 看起来合理的小。 虽然我在咆哮...... CHAR(固定长度)很少被建议。几乎总是应该是CHARACTER SET ascii——country_code、postal_code、Y/N、M/F、MD5、UUID、base64 等(MD5 和 UUID 应该更进一步,但这是另一个咆哮。) 盲目使用“255”的潜在负面影响: 如果您有很多列,您可能会达到最大行大小限制并且CREATE TABLE会失败。 您可能会超出索引大小的限制。 ComplexSELECTs可能需要一个临时表,并且可以使用MEMORY它。在这种情况下,VARCHAR(255)成为CHAR(255)临时表。而且,如果使用 utf8,则每行 755 个字节!(8.0 修复了这个设计缺陷?) 相关:不要盲目使用BIGINT所有数字。它需要 8 个字节。EvenINT是多余的,只有 4 个字节。请参阅MEDIUMINT、SMALLINT和TINYINT。请注意,(2)onINT(2)没有任何意义;它仍然需要 4 个字节。 Mike 2019-01-15T12:04:36+08:002019-01-15T12:04:36+08:00 在某个时间点,这是 Sybase 和派生 SQL Server 中列的最大长度。我确信其他人复制它以保持兼容性,因此将应用程序/SQL 迁移到新平台并不困难,因为当时每个人都在为市场份额而战。 除了兼容性之外,没有真正好的理由让它永久存在。我注意到这些天它似乎已被 varchar(max) 取代。 Hannah Vernon 2019-01-15T09:09:11+08:002019-01-15T09:09:11+08:00 “标准”列长度在所有地方都使用,并且总是表明没有进行任何努力来了解列的实际所需长度。 如果您有一列使用的字符永远不会超过 24 个,为什么要将列的长度指定为 255? 分析和使用可变长度列的正确长度需要少量工作,并确保使用过大列长度的副作用永远不会成为问题。我知道你的问题是关于 MySQL 的,但是这个答案显示了 SQL Server 如何以各种方式使用列长度,这些方式起初可能并不明显。 Joshua 2019-01-15T14:57:17+08:002019-01-15T14:57:17+08:00 我们现在采取了完全不同的规则。我们使用以下两种方法之一: `NVARCHAR(max)` 如果它不会被索引。 `NVARCHAR(400)` 如果它会被索引。 一般来说,我们认为限制已经过时,我们真的不应该再关心了。磁盘空间很便宜。400 确保始终可以在最严格的目标平台上创建索引。我的理解是 MySQL 上的 255 索引限制已经消失,否则我会写 255。关于VARCHAR你不会因为允许它比它需要的更大而受到惩罚,所以没有太大的缺点太大,所以我们只是把它设置大,不再考虑它。
我偶尔会抱怨255。当然, “255”曾经有一些原因,但许多不再有效,甚至适得其反。
在 MySQL 中,有理由停止在 191、255、767、3071、64K 以及可能的其他值。有些依赖于 Engine,有些依赖于
CHARACTER SET
等。A
VARCHAR
存储为 1 或 2 字节长度加上足够的字节用于您指定的任何字符集中的当前文本。然而,选择 1 或 2并不仅仅由单个列驱动;它由总行大小驱动。也就是说,这不是使用 255 的有效借口。使用长度为
虽然我在咆哮......
CHAR
(固定长度)很少被建议。几乎总是应该是CHARACTER SET ascii
——country_code、postal_code、Y/N、M/F、MD5、UUID、base64 等(MD5 和 UUID 应该更进一步,但这是另一个咆哮。)盲目使用“255”的潜在负面影响:
CREATE TABLE
会失败。SELECTs
可能需要一个临时表,并且可以使用MEMORY
它。在这种情况下,VARCHAR(255)
成为CHAR(255)
临时表。而且,如果使用 utf8,则每行 755 个字节!(8.0 修复了这个设计缺陷?)相关:不要盲目使用
BIGINT
所有数字。它需要 8 个字节。EvenINT
是多余的,只有 4 个字节。请参阅MEDIUMINT
、SMALLINT
和TINYINT
。请注意,(2)
onINT(2)
没有任何意义;它仍然需要 4 个字节。在某个时间点,这是 Sybase 和派生 SQL Server 中列的最大长度。我确信其他人复制它以保持兼容性,因此将应用程序/SQL 迁移到新平台并不困难,因为当时每个人都在为市场份额而战。
除了兼容性之外,没有真正好的理由让它永久存在。我注意到这些天它似乎已被 varchar(max) 取代。
“标准”列长度在所有地方都使用,并且总是表明没有进行任何努力来了解列的实际所需长度。
如果您有一列使用的字符永远不会超过 24 个,为什么要将列的长度指定为 255?
分析和使用可变长度列的正确长度需要少量工作,并确保使用过大列长度的副作用永远不会成为问题。我知道你的问题是关于 MySQL 的,但是这个答案显示了 SQL Server 如何以各种方式使用列长度,这些方式起初可能并不明显。
我们现在采取了完全不同的规则。我们使用以下两种方法之一:
如果它不会被索引。
如果它会被索引。
一般来说,我们认为限制已经过时,我们真的不应该再关心了。磁盘空间很便宜。400 确保始终可以在最严格的目标平台上创建索引。我的理解是 MySQL 上的 255 索引限制已经消失,否则我会写 255。关于
VARCHAR
你不会因为允许它比它需要的更大而受到惩罚,所以没有太大的缺点太大,所以我们只是把它设置大,不再考虑它。