Как работать с символом замены Unicode � (0xFFFD / 65533) в SQL

Я даже не знал, что символ замены Юникода (�) существовал неделю назад. Теперь я узнаю, что есть какая-то особая и странная логика, окружающая его, по крайней мере, в 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')

1 ответов


Krzysztof Kozielczyk написал, что допустимые символы юникода должны быть приведены в двоичную строку для замены, так что это может быть ответ на ваш первоначальный вопрос.

SELECT REPLACE(N'test' + NCHAR(65533) 
COLLATE Latin1_General_BIN, NCHAR(65533) COLLATE Latin1_General_BIN, '')

приведенный выше код также указывает на то, как найти строки с допустимыми символами Юникода, но это обходной путь, а не решение. источник