VARCHAR长度任何原因(2 ^ n) - 1?

时间:2017-05-05 13:34:02

标签: sql-server tsql

所以我在声明(2^n)-1varchar的任何时候都指定了nvarchar的长度,但我想知道这是不是一个好习惯。这变成了习惯,我实际上在软件开发中将所有内容定义为二进制,因为显而易见的原因,但SQL Server似乎有时让我感到惊讶(nvarchar的最大长度不是4095或4096而是4000例如......)我想知道是否存在是我正在做的事情的价值。

定义变量'像这样的长度有什么价值?我想它在过去很有价值。

编辑:如果它没有任何性能改进,为什么系统视图会使用这些长度(您可以检查其中任何一个)?例如,我检查了INFORMATION_SCHEMA.COLUMNS,列是:

Column_name                 Type        Length
----------------------------------------------
TABLE_CATALOG               nvarchar    256
TABLE_SCHEMA                nvarchar    256
TABLE_NAME                  sysname     256
COLUMN_NAME                 sysname     256
ORDINAL_POSITION            int         4
COLUMN_DEFAULT              nvarchar    8000
IS_NULLABLE                 varchar     3
DATA_TYPE                   nvarchar    256
CHARACTER_MAXIMUM_LENGTH    int         4
CHARACTER_OCTET_LENGTH      int         4
NUMERIC_PRECISION           tinyint     1
NUMERIC_PRECISION_RADIX     smallint    2
NUMERIC_SCALE               int         4
DATETIME_PRECISION          smallint    2
CHARACTER_SET_CATALOG       sysname     256
CHARACTER_SET_SCHEMA        sysname     256
CHARACTER_SET_NAME          sysname     256
COLLATION_CATALOG           sysname     256
COLLATION_SCHEMA            sysname     256
COLLATION_NAME              sysname     256
DOMAIN_CATALOG              sysname     256
DOMAIN_SCHEMA               sysname     256
DOMAIN_NAME                 sysname     256

1 个答案:

答案 0 :(得分:4)

如果使用由单个(2^n)-1字节终止的单字节字符的C约定存储字符串,则nul规则是有意义的。但据我所知,SQL Server从未存储过字符串。

在SQL Server中,字符串的长度是显式存储的(在固定长度类型的模式中或在可变长度类型的行数据中),所以,不,这个约定在这里没有意义。 / p>

在查看INFORMATION_SCHEMA次观看时,几乎所有字符列都是(直接或间接)使用sysname数据类型 - 所以它们并非如此反复选择使用2^n大小 - 他们认为sysname应该是nvarchar(128)(非常旧版本的SQL Server使用了更小的大小限制,如果内存服务则大约12个字符)。