【发布时间】: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