Sql server 为什么将文本强制转换为varchar而不指定长度会将文本截断为30个字符?

Sql server 为什么将文本强制转换为varchar而不指定长度会将文本截断为30个字符?,sql-server,text,casting,varchar,Sql Server,Text,Casting,Varchar,我在搜索MS-SQL Server 2005数据库,以确保某个文本字段的长度始终是8的倍数。当我运行下面的查询时,我发现有几行的长度为30。但当我调查这些记录时,我发现它们比那还要长 select distinct len(cast(textfield as varchar)) from tablename 但是,如果我将varchar的长度指定为更长的值(如下面的查询中所示),则效果很好 select distinct len(cast(textfield as varchar(1000)))

我在搜索MS-SQL Server 2005数据库,以确保某个文本字段的长度始终是8的倍数。当我运行下面的查询时,我发现有几行的长度为30。但当我调查这些记录时,我发现它们比那还要长

select distinct len(cast(textfield as varchar)) from tablename
但是,如果我将varchar的长度指定为更长的值(如下面的查询中所示),则效果很好

select distinct len(cast(textfield as varchar(1000))) from tablename

有人知道为什么它默认为30,这是一个可配置的设置吗?

这是一个任意数字,据我所知是不可配置的。我想不出哪种情况下您不想指定长度。

当有许多不同的行需要适合该列时,可能会发生强制转换。由于数据库引擎并不完美,它不想麻烦地检查查询可能返回的所有可能行的长度,以找出设置最大值的时间,因此它不检查任何行-它只需要默认值30,这是一个任意的粗略猜测,因为它不太清楚


可以说,对他们来说,将默认值设置为256或VARCHAR的最大长度是什么都是明智的,但我想最重要的是,这是一个很有帮助的提醒,它真的不知道你想要多长时间,除非你告诉它。

我把你的别名读作NVARCHAR:)这就是你使用SQL时得到的太多可能的重复