我的最终目标是编写一个sql脚本,用于从特定表中选择数据,其中nvarchar(max)列包含字符NCHAR(2028)。
但显而易见:
select *
from tablename
where columnname like '%' + NCHAR(2028) + '%'
返回所有行。
答案 0 :(得分:4)
使用二进制排序规则进行比较。
select *
from tablename
where columnname COLLATE Latin1_General_Bin like '%' + NCHAR(2028) + '%'
答案 1 :(得分:2)
这有效
CREATE TABLE #temp (columnname NVARCHAR(128))
INSERT #temp VALUES ('a')
INSERT #temp VALUES ( NCHAR(2028))
INSERT #temp VALUES ('b')
INSERT #temp VALUES ('c' + NCHAR(2028) + 'c')
INSERT #temp VALUES ('a' + NCHAR(2028) + 'b')
SELECT *
FROM #temp
WHERE ColumnName COLLATE Latin1_General_Bin Like N'%' + NCHAR(2028) + '%'
drop table #temp
答案 2 :(得分:1)
我认为你的排名不受限制。我有一些奇怪的行为。注意这里两个SELECT的结果:
CREATE TABLE dbo.foo
(
id INT IDENTITY(1,1),
bar NVARCHAR(128)
);
INSERT dbo.foo(bar) SELECT N'foobar'
UNION
SELECT N'foo' + NCHAR(2028) + N'bar'
SELECT *
FROM dbo.foo
WHERE bar LIKE N'%' + NCHAR(2028) + '%';
TRUNCATE TABLE dbo.foo;
INSERT dbo.foo(bar)
SELECT N'foo' + NCHAR(2028) + N'bar'
SELECT *
FROM dbo.foo
WHERE bar LIKE N'%' + NCHAR(2028) + '%';
DROP TABLE dbo.foo;
请注意,无论我们是插入了一行还是两行,我们总是返回第一行,即使查询相同且数据已更改。
不幸的是,将NCHAR(2028)的实际值粘贴到SSMS中是行不通的,因为它不在支持的字符集中(我在Super Mario Brothers中得到像问号框一样的字形)。否则我只是建议:
WHERE columnname LIKE N'%߬%';
如果你可以从代码中做到这一点(而不用担心SSMS),那么它可能是一个可行的选择。