这两个字符串之间有什么区别?

时间:2020-08-11 20:09:37

标签: sql sql-server string

我很困惑,无法找到这两套字符串之间的差异,这对我来说看起来完全一样。我检查了字符串之间是否有空格,但是没有运气。在SQL Management Studio中的查询下方运行时,只有其中一个返回结果...请帮助,谢谢。

--return row
SELECT * FROM Vendors WHERE VendorCode = 'SRP  85072B'

--does not return row
SELECT * FROM Vendors WHERE VendorCode = 'SRP  85072B'

--return rows
SELECT * FROM Vendors WHERE VendorCode IN (
'ATT  60197S',
'GMI  98661A')

--does NOT RETURN rows
SELECT * FROM Vendors WHERE VendorCode IN (
'ATT  60197S',
'GMI  98661A')

4 个答案:

答案 0 :(得分:6)

其中一个字符串具有两个连续的常规空格,另一个字符串具有不间断空格(字符160十进制0xA0十六进制),后跟一个常规空间(字符32十进制0x20十六进制)。

您可以通过复制和粘贴字符串from here来看到这一点,就像我在这里https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=0dc6ccc48439c3dc27a227aa2dffb4d2

所做的那样
0x4154542020363031393753    
0x415454A020363031393753

答案 1 :(得分:0)

可能是您的字符串或列具有特殊字符CR或CRLF,请尝试在比较中删除这些字符:

SELECT * 
FROM Vendors 
WHERE replace(replace(ltrim(rtrim(VendorCode)), char(13), ''), char(10), '') = replace(replace(ltrim(rtrim('SRP  85072B')), char(13), ''), char(10), '')

答案 2 :(得分:0)

此代码使用tally table将两个字符串分开,将每个字符转换为其ascii值,然后返回差异。

declare
  @string1      nvarchar(200)='zdq%E^&$DGE%^#((',
  @string2      nvarchar(200)='zdq%E^&$DGx%^#((';

select ascii(SUBSTRING(@string1, t.n, 1)), t.n from dbo.fnTally(1, len(@string1)) t
except
select ascii(SUBSTRING(@string2, t.n, 1)), t.n from dbo.fnTally(1, len(@string2)) t;

答案 3 :(得分:0)

如果您运行以下sql查询,它们看起来很相似

DECLARE @first nvarchar(max) = 'SELECT * FROM Vendors WHERE VendorCode = ''SRP  85072B''',
        @second nvarchar(max) = 'SELECT * FROM Vendors WHERE VendorCode = ''SRP  85072B'''

IF (@first = @second)
    SELECT 'Similar';

ELSE
    SELECT 'Not Similar';

如果参数来自同一来源,则可以使用以下查询进行检查

DECLARE @param nvarchar(max) = 'SRP  85072B'
SELECT * FROM Vendors WHERE VendorCode like  '%'+ @param+'%'