2009-08-11 322 views
23

可能重复:
Are there disadvantages to using a generic varchar(255) for all text-based fields?MySQL:为什么使用VARCHAR(20)而不是VARCHAR(255)?

在MySQL中,你可以选择为VARCHAR字段类型的长度。可能的值是1-255。

但是,如果使用最大值而不是VARCHAR(20)的VARCHAR(255),它的优点是什么?据我所知,条目的大小仅取决于插入字符串的实际长度。

大小(字节)=长度+ 1

因此,如果你在一个VARCHAR(255)字段具有单词 “实施例”,这将有8个字节。如果你在VARCHAR(20)字段中有它,它也会有8个字节。有什么不同?

我希望你能帮助我。提前致谢!

回答

24

退房:Reference for Varchar

总之没有太大的区别,除非你去的255在您的VARCHAR规模,这将需要长度前缀另一个字节。

长度表示存储在列中的数据的一个约束比其他任何更多。这固有地限制了列的MAXIMUM存储大小。恕我直言,长度应该对数据有意义。如果您存储社会安全#,将长度设置为128是没有意义的,即使您实际存储的所有内容都是SSN,也不会在存储中花费任何费用。

1

那么,如果你想允许一个更大的条目,或限制条目大小也许。

例如,您可能将first_name作为VARCHAR 20,但可能将street_address作为VARCHAR 50,因为20可能没有足够的空间。同时,你可能想要控制这个价值可以得到多大。

换句话说,您已经设定了一个特定值可以有多大的上限,理论上是为了防止表(以及潜在的索引/索引条目)变得过大。

你可以只使用CHAR这是一个固定的宽度为好,但不像VARCHAR它可以更小,CHAR垫的值(尽管这使得更快SQL访问。

+0

但为什么我应该将长度设置为20?如果没有区别,我可以简单地将它设置为255,适用于所有领域,不是吗? – caw 2009-08-11 18:42:39

+0

看到我的编辑 - 我详细阐述一点。 – OneNerd 2009-08-11 18:45:16

+0

谢谢。所以它不会在存储和性能方面产生任何差异,对吧?但是,它可能是有用的,但是,例如,如果你想剪切字符串以防止长的字符串。但是如果你在PHP中使用substr()或者在另一种语言中使用类似的函数,你也可以实现这一点!? – caw 2009-08-11 18:55:01

1

从数据库的角度来看性能方面我做的不相信会有区别

但是,我认为很多关于使用长度的决定归结为您正在努力完成的任务,并将系统记录为仅接受它所需的数据。

+1

“请注意,如果整个记录的大小是固定的,那么使用CHAR只会加快您的访问速度,也就是说,如果您使用任何可变大小的对象,则可能使它们全部变为可变大小。在一个也包含VARCHAR的表中。“ [链接](http://dev.mysql.com/doc/refman/5.0/en/char.html) – 2013-10-27 08:24:17

16

选择一个小于ar的最大值的值有很多有效的理由与表现无关。设置大小有助于指示您正在存储的数据类型,并且还可以充当最后一种验证形式。

例如,如果您要存储英国邮政编码,那么您只需要8个字符。设置此限制有助于明确您要存储的数据类型。如果你选择了255个字符,它只会混淆事项。

+1

+1用于强调清晰度和可理解性。当然,我会质疑使用buf [1024],一个“新的DynamicBuf(1024)”或者一个VARCHAR(255)来存储例如一个单独的虚线四个IP地址。编码员知道他在做什么? – pilcrow 2009-08-11 19:14:27

+4

+1如果您决定使用VARCHAR(8)作为英国邮政编码,请使用CHAR(8)表示:) – 2009-08-11 19:39:28

+1

如果要存储8个字符的邮编,则应该使用CHAR(8)。最好避免在表中存在VARCHAR列,因为它会强制varibale行长度并在表中寻找较慢的值。但是,如果你不能拥有固定长度的所有列,则不重要。 – 2013-09-09 09:42:17

1

存在语义上的差异(我相信这是唯一的区别):如果你试图将30个非空格字符填充到varchar(20)中,它将产生一个错误,而varchar(255) 。所以它主要是一个额外的限制。

+0

但是不是很清楚,30个字符不适合20字节的字段? – caw 2009-08-11 18:58:03

+2

正如你所说,存储表示并不关心这个长度:一个声明为varchar(20)的字段可以很好地存储30个字符,就磁盘表示而言 - 我认为这个观察结果是你问题的核心(为什么并不总是使用varchar(255)?)现在,我告诉你为什么设置varchar(20)的原因:因为如果你不小心尝试输入超过20个字符,你就会想要得到的错误。 – 2009-08-11 19:06:55

+0

所以它只是用于验证问题,对吗? – caw 2009-08-11 19:55:23

5

我不知道mySQL,但在SQL Server中它可以让你定义字段,使得使用的字节总数大于实际存储在记录中的总字节数。这是一件坏事。迟早你会得到一个限制已达到的行,并且你不能插入数据。

设计数据库结构以考虑行大小限制要好得多。

此外是的,你不希望人们在最大值应该是10的字段中放置200个字符。如果他们这样做,那几乎总是不好的数据。

你说,我可以限制在应用程序级别。但是数据不会从一个应用程序进入数据库。有时多个应用程序使用它,有时数据被导入,有时从查询窗口手动修复(例如更新所有记录以将价格增加10%)。如果这些其他数据源中的任何一个不知道您在应用程序中放置的规则,那么您的数据库中将会有糟糕的无用数据。数据完整性必须在数据库级别执行(这不会阻止您在尝试输入数据之前进行检查),或者您没有完整性。另外,根据我的经验,那些懒得设计数据库的人通常也懒得实际地将限制放在应用程序中,并且根本没有数据完整性检查。

他们对没有数据完整性的数据库有一个词 - 没用。

相关问题