В базе данных 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