可能重复:
Are there disadvantages to using a generic varchar(255) for all text-based fields?
在MYSQL中,您可以选择VARCHAR字段类型的长度。可能的值为1-255。
但是如果使用最大的VARCHAR(255)而不是VARCHAR(20),它的优点是什么?据我所知,条目的大小仅取决于插入字符串的实际长度。
size(bytes)= length + 1
因此,如果在VARCHAR(255)字段中有“示例”一词,则它将具有8个字节。如果你在VARCHAR(20)字段中有它,它也会有8个字节。有什么区别?
我希望你能帮助我。提前谢谢!
答案 0 :(得分:28)
简而言之,除非你在VARCHAR中超过255的大小,否则它将需要另一个字节作为长度前缀。
长度表示存储在列中的数据的约束多于其他任何约束。这固有地限制了列的MAXIMUM存储大小。恕我直言,长度应该对数据有意义。如果您存储社会保障#,将长度设置为128是没有意义的,即使您实际存储的所有内容都是SSN,也不会花费任何存储空间。
答案 1 :(得分:17)
选择小于最大值且与性能无关的值有很多正当理由。设置大小有助于指示您正在存储的数据类型,也可以作为最后一种验证形式。
例如,如果您要存储英国邮政编码,那么您只需要8个字符。设置此限制有助于清除您正在存储的数据类型。如果你选择了255个字符,那就会让事情变得混乱。
答案 2 :(得分:5)
我不了解mySQL,但在SQL Server中,它允许您定义字段,使得使用的总字节数大于实际可以存储在记录中的字节总数。这是件坏事。迟早你会得到一个达到限制的行,你不能插入数据。
设计数据库结构以考虑行大小限制要好得多。
此外,是的,您不希望人们在最大值应为10的字段中放置200个字符。如果这样做,则几乎总是坏数据。
你说,我可以在应用程序级别限制它。但是数据不会仅从一个应用程序进入数据库。有时多个应用程序使用它,有时会导入数据,有时会从查询窗口手动修复(例如,更新所有记录以便将价格加10%)。如果这些其他数据源中的任何一个都不知道您在应用程序中放置的规则,那么您的数据库中将包含错误的无用数据。必须在数据库级别强制执行数据完整性(这不会阻止您在尝试输入数据之前进行检查)或者您没有完整性。另外,根据我的经验,懒得设计数据库的人往往也懒得将限制放到应用程序中,根本没有数据完整性检查。
他们对没有数据完整性的数据库说了一句话 - 没用。
答案 3 :(得分:2)
存在语义差异(我相信这是唯一的区别):如果你尝试将30个非空格字符填充到varchar(20)中,它将产生错误,而对于varchar(255)则会成功。所以它主要是一个额外的约束。
答案 4 :(得分:1)
好吧,如果您想允许更大的条目,或者可能限制条目大小。
例如,您可能将first_name作为VARCHAR 20,但也许将street_address作为VARCHAR 50,因为20可能没有足够的空间。与此同时,您可能希望控制该值的大小。
换句话说,您已设置特定值的大小上限,理论上可以防止表(以及可能的索引/索引条目)变得太大。
您也可以使用固定宽度的CHAR,但与VARCHAR(可以更小)不同,CHAR填充值(尽管这样可以更快地访问SQL。
答案 5 :(得分:1)
从数据库的角度来看,我认为不会产生任何差异。
但是,我认为很多关于使用长度的决定归结为您要完成的任务并记录系统以接受它所需的数据。