所以我在声明(2^n)-1
或varchar
的任何时候都指定了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
答案 0 :(得分:4)
如果使用由单个(2^n)-1
字节终止的单字节字符的C约定存储字符串,则nul
规则是有意义的。但据我所知,SQL Server从未存储过字符串。
在SQL Server中,字符串的长度是显式存储的(在固定长度类型的模式中或在可变长度类型的行数据中),所以,不,这个约定在这里没有意义。 / p>
在查看INFORMATION_SCHEMA
次观看时,几乎所有字符列都是(直接或间接)使用sysname
数据类型 - 所以它们并非如此反复选择使用2^n
大小 - 他们认为sysname
应该是nvarchar(128)
(非常旧版本的SQL Server使用了更小的大小限制,如果内存服务则大约12个字符)。