我在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。
所以我完全糊涂了,这里发生了什么? 我该怎么做才能让'='运算符在我的数据库表上运行?
答案 0 :(得分:1)
尝试将表中列的数据类型更改为nvarchar(128),而不是varchar(128)。它可能神奇地解决问题(即使查询不会使用N前缀),但我无法解释原因。似乎在varchar和nvarchar数据类型之间处理CHAR(0)存在根本区别。