SQL服务器字符串相等性与CHAR(0)

时间:2015-02-06 09:17:51

标签: sql-server tsql

我在SQL Server中遇到了一个非常奇怪的问题(版本12.0.2000.8,排序规则是Hungarian_CI_AS): 我有一个带有varchar(128)可空列的表,它存储用户名, 我只是无法用简单的'='运算符匹配它们中的任何一个。 所以当我执行这样的查询时: select * from myTable where username = 'john.doe', 它不会返回任何行。

我发现当我选择与LIKE相同并将%作为尾随字符时,所以: select * from myTable where username = 'john.doe%', 它工作正常。

所以我创建了一个查询,用'$'符号替换所有char(0)-s,如下所示:

select REPLACE(username, CHAR(0), '$') from myTable
where username LIKE 'john.doe%'

它返回一个128长的文字,就像这样(塞满尾随的$ -s): john.doe $$$$$$$$$$ ....

考虑到上面的事实,我怀疑char(0)-s不知何故是问题,但是当我运行一个简单的查询来模拟'='运算符的相同条件时,我得到2个文字是相等的:

SELECT CASE WHEN ('john.doe') = ('john.doe' + CHAR(0) + CHAR(0) + CHAR(0)) THEN 'Equal' ELSE 'Not Equal' END

此查询返回Equal。

所以我完全糊涂了,这里发生了什么? 我该怎么做才能让'='运算符在我的数据库表上运行?

1 个答案:

答案 0 :(得分:1)

尝试将表中列的数据类型更改为nvarchar(128),而不是varchar(128)。它可能神奇地解决问题(即使查询不会使用N前缀),但我无法解释原因。似乎在varchar和nvarchar数据类型之间处理CHAR(0)存在根本区别。