SQL 查询 Where Column = '' 返回表情符号字符和

SQL Query Where Column = '' returning Emoji characters and

好的,所以我有一个包含三列的 table:

Id, Key, Value

我想删除所有 Value 为空的行 ('')。因此我在删除之前将查询写到 select 是:

Select * from [Imaging.ImageTag] where [Value] = ''

到目前为止都非常标准...

现在是奇怪的部分。此查询返回了如下所示的两行,各行以逗号分隔:

CE7C367C-5C4A-4531-9C8C-8F2A26B1B980,   ObjectType,  
F5B2F8A8-C4A8-4799-8824-E5FFEEDAB887,   Caption,    

为什么这两行在 '' 上匹配?

额外信息

我正在使用 Sql-Server,[Value] 列的类型是 NVARCHAR(300) 是的 table 名称确实是 [Imaging.ImageTag]

这不是您 "why" 的答案,但就您的总体目标而言,也许您应该改变搜索空值的策略:

Select * from [Imaging.ImageTag] where LEN([Value]) = 0

根据评论(感谢 Martin Smith 提供一些 copy/pastable 表情符号):

SELECT CASE WHEN N'' = N'' then 1 else 0 end --returns 1, no good for checking

SELECT LEN(N'') --returns 2, can be used to check for zero length values?

这是排序规则相关的。

匹配空字符串

SELECT 1 where N'' = N''  COLLATE latin1_general_ci_as

不匹配空字符串

SELECT 1 WHERE N'' = N''   COLLATE latin1_general_100_ci_as

100 归类更先进(虽然还不是最先进的,但它们自 2008 年以来就可用),除非您有某些特定原因不这样做,否则您应该使用更现代的归类。 The BOL entry for 100 collations特地喊出来

Weighting has been added to previously non-weighted characters that would have compared equally.

Google 派我到这里寻找一种方法来过滤 varchar 列上带有表情符号的所有行。 如果您正在寻找类似的东西:

SELECT mycolumn
FROM mytable
WHERE REGEXP_EXTRACT(mycolumn,'\x{1f600}')  <> ''
--sqlserver WHERE SUBSTRING(MyCol, (PATINDEX( '\x{1f600}', MyCol ))) <> ''

\x{1f600} 是搜索到的表情符号的字符代码,您可以找到表情符号代码 here

补充这个答案 当您需要在 sql

处使用 'like' 时
WHERE
N'' + COLUMNS like N'%'+ @WordSearch +'%' COLLATE latin1_general_100_ci_as