3

我想计算一个 ntext 字段中的字符。按照 Pinal Dave 的建议,我正在使用 datalength。但是这个功能似乎使我正在寻找的价值翻了一番。当我将字段中的值复制到 word 并计算字符时,我得到 1502。但是当我这样做时

select datalength(result) from myTable 

我得到一个 3004 个字符的值。

为什么?

4

1 回答 1

8

Unicode 是每个字符两个字节。您的NText字段是 Unicode 字符串。 DataLength()返回存储字段所需的字节数,Len()返回字符数。

From Len(): "返回指定字符串表达式的字符数,不包括尾随空格。" DataLength不排除尾随空格。对于 Unicode 字符串,您可以使用它DataLength( UnicodeStringExpression ) / DataLength( N'#' )来获取字符长度。

通常DataLength( Left( Coalesce( StringExpression, '#' ), 1 ) )将返回每个字符的字节数,因为Coalesce返回基于数据类型优先级的值,其中 Unicode 字符串的优先级高于字节字符串类型(charvarchar)。

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';
于 2012-04-04T20:02:41.453 回答