【问题标题】:SQL Server 2014 LIKE with 4 B wide character returns the entire table具有 4 B 宽字符的 SQL Server 2014 LIKE 返回整个表
【发布时间】:2015-06-07 11:13:14
【问题描述】:

我很难理解为什么在 4 B 宽的表情符号 (http://emojipedia.org/eyes/) 上带有 LIKE 条件的 SELECT 会返回表中的所有行。

-- The DB collation is Finnish_Swedish_CI_AS
CREATE TABLE #Test 
(
     Number int identity,
     Value nvarchar(20) NOT NULL
);
GO

INSERT INTO #Test VALUES ('');
INSERT INTO #Test VALUES ('a');
INSERT INTO #Test VALUES ('b');
INSERT INTO #Test VALUES ('c');
INSERT INTO #Test VALUES ('????'); -- should be http://emojipedia.org/eyes/
GO

select * from #Test where Value like '%????%'
select * from #Test where Value like N'%????%'
GO

DROP TABLE #Test;
GO

第一次选择的结果是单个表情符号行。但是,第二个选择的结果(字符串被标记为带有 N 前缀的 UNICODE)的结果都是行。

为什么第二个选择匹配表中的所有行?

实际场景我有一个网络应用程序,用户可以在其中搜索目录,如果他们搜索表情符号,则会返回整个表格,而不是正确匹配的行。

ASP.NET MVC 5 web application <-> Web Api 2 <-> EF -> SQL Server

更新我的测试 SQL 不正确,正如 @deroby 指出的那样,INSERT 语句应该标有 N'...' 才能正确插入为 Unicode。

解决方案正如@deroby 所说,这似乎是一个整理问题,将其更改为Finnish_Swedish_100_CI_AS 似乎可以让事情按预期工作。

select * from #Test where Value like N'%????%' COLLATE Finnish_Swedish_100_CI_AS

【问题讨论】:

    标签: sql-server entity-framework unicode


    【解决方案1】:

    添加后会更有趣

    INSERT INTO #Test VALUES ('?'); -- should be http://emojipedia.org/eyes/
    

    您的第一个 SELECT 现在将返回两个表情符号记录;即使它们看起来不对。原因是 ? 和 ? 都是无效的 varchar() 值。因此它们会导致一些占位符被放入数据库中(显示为??)。

    现在,如果您“正确”地进行插入并将数据作为正确的 Unicode 字符串插入,那么事情会变得更好:

    INSERT INTO #Test VALUES (N'');
    INSERT INTO #Test VALUES (N'a');
    INSERT INTO #Test VALUES (N'b');
    INSERT INTO #Test VALUES (N'c');
    INSERT INTO #Test VALUES (N'?'); -- should be http://emojipedia.org/eyes/
    INSERT INTO #Test VALUES (N'?'); -- should be http://emojipedia.org/eyes/
    
    select * from #Test -- returns everything
    select * from #Test where Value like '%?%' -- returns nothing (because it looks for the '??' placeholder
    select * from #Test where Value like N'%?%' -- returns just one line
    

    PS:这就是它在我的 SQL2012 上的工作方式(Latin1_General_BIN)。

    为什么第二个选择匹配表中的所有行?

    我也无法解释;对我来说不是。所以我猜这是一个排序问题,这些表情符号都被认为是平等的。

    确实,在做测试

    select * from #Test where Value like N'%?%' COLLATE Finnish_Swedish_CI_AS
    select * from #Test where Value like N'%?%' COLLATE Latin1_General_BIN
    

    说明这里需要找原因。至于为什么,我不知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多