【问题标题】:Issue with converting CHAR to VARCHAR in SQL Server在 SQL Server 中将 CHAR 转换为 VARCHAR 的问题
【发布时间】:2016-02-05 00:36:35
【问题描述】:

我观察到一种非常奇怪的行为。请考虑以下几点:

declare @a char(15)
set @a = 'ABC'
select len(@a), len(convert(varchar, @a)), convert(varchar, @a) + 'D', len(convert(varchar, @a) + 'D')

在生成的结果集中,值 3 和 4 是意外的:

3    3    ABC            D     16

这可能是 SQL Server 中的错误吗?还有其他解释吗?

【问题讨论】:

  • 在使用 SQL Server 的 20 年中,平均而言,我见过一个实际的 Microsoft 错误,它会导致大约十年一次的查询返回意外数据。如果您认为自己看到了一个,那么您很可能只是不了解正确的行为。
  • 如果不清楚,问题的关键不在于这是否是 SQL Server 错误。关键是这种行为似乎有些不合逻辑,因此出乎意料。因此,欢迎对行为进行有意义的解释,而不是一般的风格批评。

标签: sql-server casting char varchar


【解决方案1】:

char 数据类型是固定宽度并用尾随空格填充。

所以你的 char(15) 值用 12 个尾随空格填充(为了清楚起见,用下划线替换空格)ABC____________

来自LEN的文档...

返回指定字符串表达式的字符数, 不包括尾随空格

DATALENGTH 计算尾随空格。

【讨论】:

  • RTRIM 列(当然是在转换为 varchar 之后)去除空格。
  • @DavidG - 无需显式转换。 declare @a char(15);set @a = 'ABC';select DATALENGTH(rtrim(@a)) 返回 3。结果的数据类型是varchar(15)。但当然,分配回char(15) 只会让 OP 离开他们开始的地方。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多