我想计算一个 ntext 字段中的字符。按照 Pinal Dave 的建议,我正在使用 datalength。但是这个功能似乎使我正在寻找的价值翻了一番。当我将字段中的值复制到 word 并计算字符时,我得到 1502。但是当我这样做时
select datalength(result) from myTable
我得到一个 3004 个字符的值。
为什么?
我想计算一个 ntext 字段中的字符。按照 Pinal Dave 的建议,我正在使用 datalength。但是这个功能似乎使我正在寻找的价值翻了一番。当我将字段中的值复制到 word 并计算字符时,我得到 1502。但是当我这样做时
select datalength(result) from myTable
我得到一个 3004 个字符的值。
为什么?
Unicode 是每个字符两个字节。您的NText
字段是 Unicode 字符串。 DataLength()
返回存储字段所需的字节数,Len()
返回字符数。
From Len()
: "返回指定字符串表达式的字符数,不包括尾随空格。" DataLength
不排除尾随空格。对于 Unicode 字符串,您可以使用它DataLength( UnicodeStringExpression ) / DataLength( N'#' )
来获取字符长度。
通常DataLength( Left( Coalesce( StringExpression, '#' ), 1 ) )
将返回每个字符的字节数,因为Coalesce
返回基于数据类型优先级的值,其中 Unicode 字符串的优先级高于字节字符串类型(char
和varchar
)。
declare @Foo as VarChar(10) = 'Foo and ';
declare @Bar as NVarChar(10) = N'Bar and ';
select @Foo as [@Foo],
Len( @Foo ) as [Len (trimmed)], DataLength( @Foo ) as [DataLength (bytes)],
DataLength( Left( Coalesce( @Foo, '#' ), 1 ) ) as BytesPerCharacter,
DataLength( @Foo ) / DataLength( Left( Coalesce( @Foo, '#' ), 1 ) ) as 'Characters';
select @Bar as [@Bar],
Len( @Bar ) as [Len (trimmed)], DataLength( @Bar ) as [DataLength (bytes)],
DataLength( Left( Coalesce( @Bar, '#' ), 1 ) ) as BytesPerCharacter,
DataLength( @Bar ) / DataLength( Left( Coalesce( @Bar, '#' ), 1 ) ) as 'Characters';