3
create table #temp(name nvarchar(10))
insert into #temp values('one')
select * from #temp where name = 'one'
select * from #temp where name = 'one ' --one with space at end
drop table #temp

在上面我使用 nvarchar 作为名称。我的要求是第一个选择查询的结果应该存在,第二个查询不应该返回。不要修剪名称。建议我在 sql server 中可以使用哪种数据类型?

4

1 回答 1

1

它不是可以解决此问题的数据类型。你需要看这篇文章: INF:SQL Server 如何比较字符串和尾随空格

SQL Server 遵循关于如何比较字符串和空格的 ANSI/ISO SQL-92 规范(第 8.2 节,一般规则 #3)。ANSI 标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响 WHERE 和 HAVING 子句谓词的语义以及其他 Transact-SQL 字符串比较。例如,Transact-SQL 认为字符串“abc”和“abc”对于大多数比较操作是等效的。

有几种方法可以克服这个问题,一种是使用Like.

select * from #temp where name like 'one ' --one with space at end

这将不返回任何结果。

您应该看到这篇博文:AnthonyBloesch的测试字符串的相等计数尾随空格

于 2012-09-18T09:01:22.977 回答