不再有 varchar(255) 的新功能

What's new for no more varchar(255)

我在处理一个老项目,当我看到有提示"no more than 200 characters"(中文),但是那家伙设置了一个列varchar(255),显然不对(它可以只保留UTF-8中255/3长度的中文)。

现在是 2016 年(我的意思是旧时已去,varchar(255) 定义规则应该被打破),我看到 MySQL 支持将 varchar 长度设置为超过 255 个字符。太棒了!

但我不确定其他数据库引擎是否像 pgSQL 甚至 MS SQL Server(尽管我从未尝试过),以及 SQL 标准说的是什么关于它?

我们可以打破varchar(255)规则吗?

你指的 "VARCHAR(255) rule" 是什么?

每个数据库供应商都可以按照自己的意愿自由实现 VARCHAR。 VARCHAR 的规则(和准则)不一定对每个数据库都相同。

至于 SQL 标准,我还没有真正研究过。它可能相当松散,因此所有 VARCHAR 实现都被发现符合标准。如果 VARCHAR 的 SQL 标准真的很严格,那么 DBMS 供应商可能会扩展该标准,或者只是可能不兼容。我认为实际标准并不重要。重要的是 DBMS 执行的实际规则。

就一般准则而言,指定长度足以支持系统要求的 VARCHAR。如果系统要求不超过200个字符,那么我指定长度为VARCHAR(200)

作为另一条通用准则,不要定义大于所需长度的 VARCHAR 长度。声明的 VARCHAR 列长于必要的时间会对资源和性能产生影响。

Oracle 对 VARCHAR 长度的限制是 4000 个字符。 (在以前的Oracle版本中,最大为2000。如果你需要超过4000个字符,那么你可以使用CLOB数据类型。

SQL 服务器限制为 VARCHAR(8000),除非您指定 VARCHAR(MAX),这允许最大大小(以字节为单位)为 2^32-1。

MySQL 的最大行长度限制为 65,535。因此,如果使用像 utf8 这样的多字节字符集,则有效地将 VARCHAR 的大小限制为 VARCHAR(21844)。对于单字节字符集(如 latin1),最大值为 VARCHAR(65532)。如果您需要比这更多的字符,或者您 运行 达到最大行长度的限制,您可以使用 TEXT 数据类型而不是 VARCHAR。


大多数 DBMS VARCHAR 实现存储 VARCHAR 列的 "length" 字段以及值。长度存储为整数。

在某些DBMS中,如果VARCHAR列的最大长度(以字节为单位)不超过255字节,则长度字段可以实现为单字节整数。如果该列允许超过 255 个字节,则长度字段必须大于一个字节。


对于动态行格式,就行存储而言,在一列中存储10个字符,该列定义为VARCHAR(30)还是VARCHAR(1000)并不重要。对于固定行格式,将保留列最大长度的 space。行存储的格式将取决于 DBMS,并且在某些情况下 (MySQL) 取决于存储引擎和指定的行格式。

是的,现在是 2016 年。自从推出第一个商业关系数据库系统以来,我们已经取得了长足的进步。

数据库只是系统的一部分。应用程序或其他软件组件可能存在限制。 (如果应用程序是用 C 编写的,并且应用程序正在为字段定义一个带有字节数组的结构,那么大小的限制将很重要。增加数据库中允许的大小不会自动修复应用程序.

Javascript 代码或网页的 HTML 元素中也可能有长度 limits/restrictions。或者可能存在其他软件组件的限制。例如,一些非常古老的 SQL 服务器 ODBC 驱动程序对 CHAR 和 VARCHAR 列都有 255 个字符(字节?)的限制。

所以数据库中 VARCHAR 的长度只是故事的一部分。


说了这么多,当你问的时候,我还是不太清楚你的意思

我们可以打破 VARCHAR(255) 规则吗?

我想知道 "rule" 你指的是什么。在我所知道的大多数数据库中,可以定义比 255 个字节或 255 个字符长得多的 VARCHAR 列。这样做并没有违反任何规则。