В базе данных SQL Server

в моей базе данных У меня есть этот char. Я хочу найти их с запросом

Select * 
from Sometable 
where somecolumn like '%�%'

это не дает мне результата.

Я думаю, что это кодировка ANSI

Ответы

Ответ 1

Это символ символ символа замены Unicode.

Он может соответствовать любому из 2048 неверных кодовых точек в кодировке UCS-2 (или одиночный символ U+FFFD для самого символа).

Вы можете использовать диапазон и двоичное предложение collate для их соответствия (demo).

WITH T(N)
AS 
(
SELECT TOP 65536 NCHAR(ROW_NUMBER() OVER (ORDER BY @@SPID))
FROM master..spt_values v1, 
     master..spt_values v2
)
SELECT N 
FROM T
WHERE N LIKE '%[' +  NCHAR(65533) + NCHAR(55296) + '-' + NCHAR(57343) + ']%' COLLATE Latin1_General_100_BIN

Ответ 2

используйте N, как показано ниже

 where col like N'%�%'

почему вы думаете, вам нужен префикс N:

Префикс Unicode символьные строковые константы с буквой N. Без префикса N строка преобразуется в кодовую страницу по умолчанию базы данных. Эта кодовая страница по умолчанию может не распознавать определенные символы.

Благодаря Мартину Смиту, раньше я тестировал только один персонаж раньше, и он работал, но, как заметил Мартин, он возвращает все символы.

Ниже запрос работает и возвращает только предназначенные

select * from #demo where id  like N'%�%' 
COLLATE Latin1_General_100_BIN

Демо:

create table #demo
(
id nvarchar(max)
)

insert into #demo
values
(N'ﬗ'),
( N'�')

чтобы узнать больше о unicode, см. ниже ссылки

http://kunststube.net/encoding/

https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

Ответ 3

Вы можете использовать ASCII, чтобы узнать код ascii для этого char

Select ascii('�')

И используйте CHAR для извлечения char из этого кода и объедините его в выражении LIKE

Select * from Sometable
where somecolumn like '%'+CHAR(63)+'%'

Обратите внимание, что используемое сопоставление может повлиять на результат. Также это зависит от кодировки, используемой вашим приложением для подачи ваших данных (UTF-8, UNICODE и т.д.). также как вы храните его в VARCHAR, или NVARCHAR имеет последнее слово о том, что вы видите.

Там больше здесь в этом подобном вопросе

ИЗМЕНИТЬ @Mark

попробуйте этот простой тест:

create table sometable(somecolumn nvarchar(100) not null)
GO

insert into sometable
values
 ('12345')
,('123�45')
,('12345')
GO

select * from sometable
where somecolumn like '%'+CHAR(63)+'%'
GO

Это означает, что символ был сохранен, как "?" в этом тесте.

Когда вы видите, это означает, что приложение, в котором вы видите, не совсем уверен, что распечатать.

Это также означает, что OP, вероятно, должен выяснить, что char - это использование запроса. Также обратите внимание, что строка, выводимая как , может быть 3 образована разными символами.

CHAR (63) был просто примером, но вы правы в ASCII table будет стандартным опросом.

ИЗМЕНИТЬ @Bridge

Не со временем прямо, чтобы глубоко разобраться в нем, но ниже тест не работал

Select ascii('�'), CHAR(ascii('�')), UNICODE(N'�'), CHAR(UNICODE(N'�'))
GO

create table sometable(somecolumn nvarchar(100) not null)
GO

insert into sometable
values
 ('12345')
,('123�45')
,('12345')
,('12'+NCHAR(UNICODE(N'�'))+'345')
GO

select * from sometable
where somecolumn like '%'+CHAR(63)+'%'

select * from sometable
where somecolumn like '%'+NCHAR(UNICODE(N'�'))+'%'

GO