VARCHAR为什么需要长度规定?

77
为什么我们总是需要指定VARCHAR(length)而不只是VARCHAR?反正它的长度是动态的。
更新:我特别困惑的是这在MySQL中是强制性的。

2
可能是 https://dev59.com/oXE95IYBdhLWcg3wmvCh#2244926 的重复问题。 - Bob Jarvis - Слава Україні
谢谢,这真的是一个重复的。 - Fixpoint
7个回答

44

"length"指的不是VARCHAR中内容的长度,而是其最大长度。

VARCHAR的最大长度不是动态的,而是固定的,因此必须指定。

如果您不想为其定义最大大小,则可以使用VARCHAR(MAX)。


14
为什么VARCHAR默认不意味着VARCHAR(MAX)?INT有默认大小,那么为什么VARCHAR不能有默认大小?创建SQL标准时采取这种设计决策的原因是什么? - Fixpoint
2
当 SQL Server 标准被创建时,VARCHAR(MAX) 不存在。它是 varchar(8000) 或 text。 - Robin Day
4
VARCHAR(MAX)和VARCHAR(8000)(最大的非MAX类型)在底层处理方式上不同。只有在确实需要时才使用VARCHAR(MAX),否则性能会受到影响。 - bobroxsox

18
首先,不是所有数据库都需要它。看一下SQL Server,在那里它是可选的。
无论如何,它定义了字段内容的最大大小。本身并不是坏事,并且传达意义(例如-电话号码,您不希望将国际号码放在该字段中)。

3
在 SQL Server 中,如果没有定义数据类型的大小,会根据不同情况自动使用不同的默认值,因此需要注意。例如,参考这篇文章:http://www.adathedev.co.uk/2010/04/sql-cast-to-varchar-without-size.html - AdaTheDev
2
当在数据定义或变量声明语句中未指定n时,默认长度为1。在使用CAST和CONVERT函数时未指定n时,默认长度为30。 - Dima Fomin

8

你可以把它看作是对你的数据的限制。它确保你不会存储违反你约束条件的数据。从概念上讲,它类似于在整数列上设置检查约束条件,以确保只输入正值。


4

数据库对存储数据的了解越多,当进行搜索/添加/更新请求时,它就可以进行更多的优化。


17
基于varchar的最大长度,它可以进行哪些优化? - Fixpoint
1
许多事情需要在查询执行之前分配RAM以供工作空间、排序、哈希等使用;这在大多数DBMS中必须事先知道,引擎会根据已知的列数据类型来猜测应该分配多少空间。如果为所有内容指定varchar(max),例如SQL Server会假设平均填充率约为50%,并尝试预留过多的内存,影响服务器和并发性能。 - Stu

4
答案是,不需要,这是可选的。
如果你想要确保字符串不超过一定长度,那么可以使用它。

3

来自维基百科:

Varchar字段大小可以是任意的,但有大小限制。限制因数据库类型而异,Oracle 9i数据库限制为4000字节,MySQL数据库限制为65535字节(对于整个行),Microsoft SQL Server 2005限制为8000字节(除非使用varchar(max),其最大存储容量为2147483648字节)。


3

正如@DimaFomin在评论中指出的那样,对程序员来说最危险的事情是如果没有指定长度,则会强制执行默认长度

SQL Server如何执行默认长度:

declare @v varchar = '123'
select @v

结果:

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接