【发布时间】:2015-07-26 05:52:59
【问题描述】:
我几乎不知道一周前就存在 Unicode 替换字符 (�)。现在我了解到至少在 SQL 中似乎有一些非常特殊和奇怪的逻辑围绕着它。例如:
select replace(N'bl' + NCHAR(65533) + N'rt', NCHAR(65533), N'X')
返回 bl�rt 而不是 blXrt。并且:
select CHARINDEX(NCHAR(65533), N'b' + NCHAR(65533) + N't')
返回 0 而不是 2。我只是想确定表中的哪些字符串包含此字符,但找不到直接的方法。这个人物的待遇好诡异,一定有更多可以了解的地方。行为在哪里定义,更具体地说,在 MS SQL Server 数据库中查找包含此字符的字符串的最简单方法是什么?
编辑 对于任何尝试答案的人,我建议根据以下数据测试您的答案:
create table Test([Value] nvarchar(100) not null)
insert into Test([Value]) values('b' + NCHAR(65533) + 't')
insert into Test([Value]) values('b?t')
insert into Test([Value]) values('bat')
【问题讨论】:
-
这是否取决于数据库或表的排序规则?只是出于好奇,您使用的是什么排序规则?
-
该列是 nvarchar(100) (所以它是 Unicode)并且没有应用特定的排序规则,所以我猜它是从数据库中获取排序规则。数据库排序规则是 SQL_Latin1_General_CP850_CI_AS。
-
@Jodrell 它与 TSQL 相关,我认为我可以在 C# 中识别包含此字符的字符串,但我不能在简单的 TSQL 代码中这样做,因为它是面向批处理的。
-
我改变主意了,我认为你暴露了一个不令人满意的边缘案例。
-
奇怪的是
SELECT CHARINDEX(NCHAR(65533), NCHAR(65533));是正确的。
标签: sql sql-server unicode