Sql 值似乎很好,但使用=与预期值进行比较返回false

Sql 值似乎很好,但使用=与预期值进行比较返回false,sql,sql-server,database,Sql,Sql Server,Database,我有一个varchar列,设置为varchar(255),但我无法使用=运算符进行查询 我知道在这个集合中有数据,字段(UOM)=“PK”,但是当我查询这个时,我没有得到任何结果。如果我像“%PK%”一样查询计量单位,我会得到结果,但不会使用直接相等运算符。我尝试过将数据类型更改为nvarchar,也尝试过查看列中是否有空格,但没有成功 有人碰到过这样的事情吗?你是怎么解决的?列是否已损坏?很可能是前导空格。。。在ltrim(UOM)='PK'的位置尝试。大多数情况下,尾随空格不影响相等操作,但

我有一个
varchar
列,设置为
varchar(255)
,但我无法使用
=
运算符进行查询

我知道在这个集合中有数据,字段
(UOM)=“PK”
,但是当我查询这个时,我没有得到任何结果。如果我像“%PK%”一样查询
计量单位,我会得到结果,但不会使用直接相等运算符。我尝试过将数据类型更改为
nvarchar
,也尝试过查看列中是否有空格,但没有成功


有人碰到过这样的事情吗?你是怎么解决的?列是否已损坏?

很可能是前导空格。。。在
ltrim(UOM)='PK'
的位置尝试。大多数情况下,尾随空格不影响相等操作,但您也可以在
ltrim(rtrim(UOM))=“PK”
的位置执行此操作。我不希望出现区分大小写的问题,但在比较字符串时也要记住这一点,这就是您可能希望使用
UPPER()
LOWER()
方法的地方

接下来,您需要开始查找回车、换行、制表符等

declare @var varchar(64) =  char(10) + --LF
                            char(13) + --CR
                            'PK'
select 
    case when replace(replace(@var,char(10),''),char(13),'') = 'PK' then 1 else 0 end
    ,case when @var = 'PK' then 1 else 0 end

当然,如果是这种情况,您可以清理您的数据,或者继续像

一样与我们联系,谢谢您的回复!我发现了一篇有用的文章,其中显示了字段中隐藏的ASCII字符。一个快速替换声明,我们就可以恢复正常工作了!再次感谢大家的快速回复。

如果像
一样的
有效,那么这个专栏包含的不仅仅是
PK
,你到底想弄明白什么?如果你做
LEN(UOM)
,你会得到什么?这会让你知道你在寻找多少额外字符。尝试将值转换为ASCII码,这将准确显示内容,例如:请注意,当有人向你提供可能的答案时,让他们发布答案是一种良好的礼仪,下一次要记住的是:)恐怕我没有否决你,那是另一个人。谢谢你的主意!我看了尾随空格,但没想到前导空格。不过,我刚才确实尝试过这个,但仍然没有运气。可能是各种各样的,跟踪crlf,其他隐藏字符等。非常罕见@DavidG,但是的,可能是这样。我会更新为什么它不常见?这种情况经常发生,尤其是从外部源导入数据时(我说的是Excel)哈哈,几乎不值得DV,但将数据导入RDMS并不是最常见的做法。虽然它发生了,但我认为它远不如应用程序中的OLTP常见。大多数开发人员在导入之前都会清理它,以避免出现这种情况。。。