SQL 查询 Where Column = '' 返回 Emoji 字符 ????和 ????
Posted
技术标签:
【中文标题】SQL 查询 Where Column = \'\' 返回 Emoji 字符 ????和 ????【英文标题】:SQL Query Where Column = '' returning Emoji characters ???? and ????SQL 查询 Where Column = '' 返回 Emoji 字符 ????和 ???? 【发布时间】:2018-05-13 02:06:41 【问题描述】:好的,所以我有一个包含三列的表格:
Id, Key, Value
我想删除 Value
为空的所有行 (''
)。因此,我在删除之前编写了要选择的查询:
Select * from [Imaging.ImageTag] where [Value] = ''
到目前为止一切都很标准......
现在是奇怪的部分。此查询返回如下所示的两行,以逗号分隔列:
CE7C367C-5C4A-4531-9C8C-8F2A26B1B980, ObjectType, ????
F5B2F8A8-C4A8-4799-8824-E5FFEEDAB887, Caption, ????
为什么这两行在''
上匹配?
额外信息
我正在使用 Sql-Server,[Value]
列的类型是 NVARCHAR(300)
,是的,表名确实是 [Imaging.ImageTag]
【问题讨论】:
您使用的是什么数据库平台以及Value
的确切类型是什么?
你能做这样的事情吗:Select *, CAST([value] as VARBINARY) from [Imaging.ImageTag] i where [Value] = ''
(SQLServer 表示法..)并展示给我们看?我怀疑构成表情符号的任何字节都被比较天真地视为等于空字符串,可能是因为它们以 ascii nul 0x00 开头.. (也许表情符号正在转换为 ascii 进行比较,并且转换正在将其减少为 '')
在 SQL Server 中,我的默认排序规则 SELECT 1 where '' = N'????'
返回 1 - 因此它出于某种原因匹配空字符串。
...这些表情符号真的是坏吗?我希望我在工作中的问题是丰富多彩的^ ^
[Imaging.ImageTag]
看起来不对。你真的有一张名为"Imaging.ImageTag"
的表吗?
【参考方案1】:
这取决于排序规则。
匹配空字符串
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 特地呼唤
权重已添加到以前未加权的字符中 会被平等比较。
【讨论】:
@martin_smith 非常有趣。你能解释一下collate实际上在做什么吗?如果有办法在数据库级别而不是查询级别进行设置? 排序规则设置字符串比较语义。您可以在数据库和列级别以及查询级别设置它,但在数据库级别设置它不会级联到现有列。如果这是一个现有的应用程序,我不会在数据库级别对其进行更改,除非您具有良好的测试覆盖率,因为您可能会发现最终会出现排序不匹配错误以进行比较。 @user1 了解更多信息,请参阅:How Many Bytes Per Character in SQL Server: a Completely Complete Guide【参考方案2】:这不是你“为什么”的答案,但就你的总体目标而言,也许你应该改变搜索空值的策略:
Select * from [Imaging.ImageTag] where LEN([Value]) = 0
根据 cmets(感谢 Martin Smith 提供一些复制/粘贴的表情符号):
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?
【讨论】:
【参考方案3】:补充这个答案 当你需要在 sql 中使用 'like' 时
WHERE
N'' + COLUMNS like N'%'+ @WordSearch +'%' COLLATE latin1_general_100_ci_as
【讨论】:
【参考方案4】:Google 将我发送到此处,寻找一种在 varchar
列上使用表情符号过滤所有行的方法。
如果您正在寻找类似的东西:
SELECT mycolumn
FROM mytable
WHERE REGEXP_EXTRACT(mycolumn,'\x1f600') <> ''
--sqlserver WHERE SUBSTRING(MyCol, (PATINDEX( '\x1f600', MyCol ))) <> ''
\x1f600
是搜索到的表情符号的字符代码,你可以找到表情符号代码here
【讨论】:
我认为 SQL Server(来自 OP)没有REGEXP_EXTRACT()
在 SQL server 中你可以使用 SUBSTRING(MyCol, (PATINDEX( 以上是关于SQL 查询 Where Column = '' 返回 Emoji 字符 ????和 ????的主要内容,如果未能解决你的问题,请参考以下文章
MySQLjava.sql.SQLException:Unknown column ‘****‘ in ‘where clause‘错误问题原因以及如何解决?
MySQLjava.sql.SQLException:Unknown column ‘****‘ in ‘where clause‘错误问题原因以及如何解决?
(SQL) Select SUM of (Column 1) * Min(Column2) where Column 1 and 2 share an ID
查询避免Unknown column ‘xxx’ in ‘where clause