我正在处理一个旧项目,当我看到有提示"不超过200个字符" (中文),但是这个人设置了一个列varchar(255)
,显然不对(它只能保留255/3长度的中文,用UTF-8)。
这是2016年(我的意思是旧时代已经过时,varchar(255)
定义规则应该被打破),我看到MySQL支持将varchar长度设置为超过255个字符。太棒了!
但我不确定其他数据库引擎是否像pgSQL甚至MS SQL Server(虽然我从未尝试过),以及SQL标准对此有何看法?
我们可以违反varchar(255)
规则吗?
答案 0 :(得分:2)
你指的是什么“VARCHAR(255)规则”?
每个数据库供应商都可以自由地实现VARCHAR。对于每个数据库,VARCHAR的规则(和指南)不一定相同。
就SQL标准而言,我还没有真正研究过它。它可能非常松散,因此所有VARCHAR实现都符合标准。如果VARCHAR的SQL标准非常严格,那么DBMS供应商可能会扩展标准,或者可能不合规。我认为实际标准并不重要。重要的是DBMS实施的实际规则。
就一般准则而言,指定足够长的VARCHAR长度以支持系统要求。如果系统的要求是允许不超过200个字符,那么我将长度指定为VARCHAR(200)
。
作为另一个一般准则,不要定义大于它们所需的VARCHAR长度。声明时间超过必要的VARCHAR列会对资源和性能产生影响。
VARCHAR长度的Oracle限制为4000个字符。 (在以前的Oracle版本中,最大值为2000.如果需要超过4000个字符,则可以使用CLOB
数据类型。
SQL Server限制为VARCHAR(8000)
,除非您指定允许最大大小(以字节为单位)为2 ^ 32-1的VARCHAR(MAX)
。
对于最大行长度限制,MySQL的限制为65,535。因此,如果使用像utf8这样的多字节字符集,那么有效地将VARCHAR的大小限制为VARCHAR(21844)。使用单字节字符集(如latin1),最大值为VARCHAR(65532)。如果您需要更多字符,或者遇到最大行长度的限制,则可以使用TEXT数据类型而不是VARCHAR。
大多数DBMS VARCHAR实现为VARCHAR列存储“length”字段以及值。长度存储为整数。
在某些DBMS中,如果VARCHAR列的最大长度(以字节为单位)不超过255个字节,则length字段可以实现为单字节整数。如果列允许超过255个字节,则长度字段必须大于单个字节。
对于动态行格式,就行存储而言,在列中存储10个字符时,如果将列定义为VARCHAR(30)或VARCHAR(1000)并不重要。对于固定的行格式,将保留列的最大长度的空间。行storags的格式将取决于DBMS,在某些情况下(MySQL)依赖于存储引擎和指定的行格式。
是的,现在是2016年。自推出第一个商业关系数据库系统以来,我们已经走了很长的路。
数据库只是系统的一部分。应用程序或其他软件组件可能存在限制。 (如果应用程序是用C语言编写的,并且应用程序正在为字段定义一个包含字节数组的结构,那么对大小的限制将非常重要。增加数据库中允许的大小将不会自动修复应用程序
Javascript代码或网页的HTML元素中也可能存在长度限制/限制。或者可能存在其他软件组件的限制。例如,一些真正旧的SQL Server ODBC驱动程序对CHAR和VARCHAR列都有255个字符(字节?)的限制。
因此,数据库中VARCHAR的长度只是故事的一部分。
所有这些都说明了,当你提问时,我仍然不清楚你的意思
我们可以打破VARCHAR(255)规则吗?
我想知道你指的是什么“规则”。在我所知道的大多数数据库中,可以定义长度超过255个字节或255个字符的VARCHAR列。这样做并没有违反任何规则。