【问题标题】:why does sql server's datalength function double the length of my field?为什么 sql server 的 datalength 函数会使我的字段长度加倍?
【发布时间】:2012-04-04 19:55:11
【问题描述】:

我想计算 ntext 字段中的字符数。 Following Pinal Dave's advice, I am using datalength。但是这个功能似乎使我正在寻找的价值翻了一番。当我将字段中的值复制到 word 并计算字符时,我得到 1502。但是当我这样做时

select datalength(result) from myTable 

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

为什么?

【问题讨论】:

  • 不相关 - 小心年份(入口日期)。那现在不能使用索引。虽然 entrydate >= '2012-01-01' 和 entrydate

标签: sql sql-server datalength


【解决方案1】:

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

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

一般DataLength( Left( Coalesce( StringExpression, '#' ), 1 ) ) 将返回每个字符的字节数,因为Coalesce 返回一个基于data type precedence 的值,其中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';

【讨论】:

  • 如果你想知道文本字段的长度,你会被 datalength 困住,因为 len() 不起作用。这是否意味着您必须始终拥有字符的数据长度(因为 unicode 是每个字符 2 个字节)。
  • @akh2103 - 您只需将DataLength 的结果除以二即可得到字符数。您可以除以DataLength( N'X' ) 作为提示/提醒。
  • Len() 会忽略尾随空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多