SQL server Varchar(max) 和占用的空间

Posted

技术标签:

【中文标题】SQL server Varchar(max) 和占用的空间【英文标题】:SQL server Varchar(max) and space taken 【发布时间】:2013-06-15 11:20:29 【问题描述】:

如果使用varchar(max)作为数据类型并且插入的数据小于完全分配,即只有200个字符,那么SQL Server总是会占用varchar(max)的全部空间还是只占用200个字符的空间?

此外,即使插入较少的数据也会占用最大空间的其他数据类型是什么?

是否有任何文件说明了这一点?

【问题讨论】:

最大值为 2 GB。我认为每条记录不会占用 2 GB。 【参考方案1】:

来自MS DOCS on char and varchar (Transact-SQL):

char [ ( n ) ] 固定长度的非 Unicode 字符串数据。 n 定义字符串长度,并且必须是 1 到 8,000 之间的值。 存储大小为 n 字节。 char 的 ISO 同义词是 character。

varchar [ ( n | max ) ] 可变长度、非 Unicode 字符串数据。 n 定义字符串长度,可以是 1 到 8,000 之间的值。 max 表示最大存储大小为 2^31-1 字节(2 GB)。 存储大小为输入数据的实际长度+2字节。 varchar 的 ISO 同义词是 char 变化或字符变化。

因此对于 varchar,包括 max - 存储将取决于实际数据长度,而 char 始终是固定大小,即使没有使用整个空间。

【讨论】:

【参考方案2】:

仅对字符串使用CHAR 你知道谁的长度是固定的。例如,如果您定义一个域 其值仅限于“T”和“F”,您可能应该使 那CHAR[1]。如果您要存储美国社会安全号码,请 域CHAR[9](或CHAR[11],如果你想要标点符号)。

VARCHAR 用于长度可变的字符串,例如名称、短字符串 描述等。当您不想担心时使用VARCHAR 剥离尾随空格。除非有充分的理由,否则请使用 VARCHAR 不要。

【讨论】:

AFract - 请不要那么迂腐。 Hitesh 只是为原始问题增加了价值,他/她的回答肯定是相关的,我发现这很有帮助,而你/你的则不是。【参考方案3】:

varchar 大小取决于数据的长度。所以在你的情况下,它只需要 200 个字符

【讨论】:

以上是关于SQL server Varchar(max) 和占用的空间的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 自动确定来自 VARCHAR(MAX) 列的数据类型

无法使用 SSIS 将 SQL Server varchar(max) 传输到 MySQL 文本

varchar(max) MS SQL Server 2000,有问题吗?

SQL Server Always Encrypted:操作数类型冲突:varchar 与 varchar(max) 不兼容

SQL Server 2012 中的最大行大小与 varchar(max) 字段

SQL Server:最好使用 varchar(MAX) 还是保留一个单独的注释表和 INNER JOIN 呢?