【问题标题】:SQL Query Where Column = '' returning Emoji characters ???? and ????SQL 查询 Where Column = '' 返回 Emoji 字符 ????和 ????
【发布时间】:2023-04-06 19:37:01
【问题描述】:

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

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"的表吗?

标签: sql-server tsql unicode collation supplementary


【解决方案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 非常有趣。你能解释一下collat​​e实际上在做什么吗?如果有办法在数据库级别而不是查询级别进行设置?
  • 排序规则设置字符串比较语义。您可以在数据库和列级别以及查询级别设置它,但在数据库级别设置它不会级联到现有列。如果这是一个现有的应用程序,我不会在数据库级别对其进行更改,除非您具有良好的测试覆盖率,因为您可能会发现最终会出现排序不匹配错误以进行比较。
【解决方案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,'\x{1f600}')  <> ''
      --sqlserver WHERE SUBSTRING(MyCol, (PATINDEX( '\x{1f600}', MyCol ))) <> ''
      

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

      【讨论】:

      • 我认为 SQL Server(来自 OP)没有 REGEXP_EXTRACT()
      • 在 SQL server 中你可以使用 SUBSTRING(MyCol, (PATINDEX( , [MyCol] )))。
      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 2018-10-05
      相关资源
      最近更新 更多