2017-04-18 2 views
15

내 데이터베이스에이 문자가 있습니다. 검색어로 찾으려는 경우SQL Server 데이터베이스

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

결과가 표시되지 않습니다.

나는 그것을 ANSI 인코딩

+1

은 varchar/char 또는 nvarchar/nchar 열입니까? – gsharp

+0

어떤 SQL Server 버전을 사용하고 있습니까? –

+15

로 표시 될 문자가 두 개 이상 있습니다. 모두 코드 페이지에 표시되지 않습니다. 모두에 대해 동일한 그래픽 표현을 볼 수 있지만 여전히 다른 문자이며 비교 결과는 false를 반환합니다. –

답변

6

일을하지 않습니다.

UCS-2 인코딩의 유효하지 않은 코드 포인트 2,048 개 (또는 기호 자체의 경우 단일 문자 U+FFFD)와 일치 할 수 있습니다.

범위와 이진 조합문을 모두 사용하여 일치시킬 수 있습니다 (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 
+0

내가 여기서 바꿀 유일한 것은 그 2,048 코드 포인트는 특히 특정 조합에서 사용하도록 요구되고, 개별적으로 아무것도 나타내지 않아도된다는 것입니다. –

+0

@srutzky - UCS-2가 서로 게이트 쌍을 지원하지 않는다는 것을 이해했습니다. –

+0

마틴 : 예, UCS-2에는 서로 게이트 쌍에 대한 매핑이 없지만 모든 상위 및 하위 대리인 코드 포인트는 그 용도로 예약되어 있습니다 (UTF-16으로 구현 됨).다행히 SQL Server는 .NET 및 Windows와 마찬가지로 UTF-16 (Little Endian)입니다. 'NCHAR (0xD83C), NCHAR (0xDF78), NCHAR (0xD83C) + NCHAR (0xDF78), NCHAR (0x01F378);'을 실행하여 이것을 볼 수 있습니다. 개별적으로 코드 포인트는 의미가 없지만 올바른 조합으로 올바르게 표시됩니다. 그리고 만약 당신이 DB에서'_SC'로 끝나는 기본 데이터 정렬을 가지고 있다면, 그 네 번째 필드는'NULL' 대신에 문자를 보여줄 것입니다. –

14

사용 N 같은

where col like N'%�%' 

why do you think ,you need N prefix 아래의 생각 :

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'�') 

것은 알 모 에 대한 유니 코드 재, 아래 참조 당신은 그 문자

Select ascii('�') 

의 아스키 코드를 찾아 ASCII를 사용에서 문자를 검색 할 CHAR을 사용할 수 있습니다

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/

+1

'COLLATE' 옵션을 추가하는 편집을해도,이 문자는 이제 하나의 문자와 일치하기 때문에 여전히 틀립니다. 같은 코드 포인트가 아니지만 문제의 캐릭터와 함께 표시되는 다른 것들입니다. 'NCHAR (0xD808) NCHAR (0xD808) LIKE N '% %'COLLATE Latin1_General_100_BIN2 THEN 'YES'ELSE 'NO'END;'다음과 같은 질의를 시도해보십시오. –

5

연결하십시오 해당 코드를 결합하여 LIKE 표현

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

사용하는 데이터 정렬은 결과에 영향을 미칠 수 있습니다. 또한 데이터를 제공하기 위해 애플리케이션에서 사용하는 인코딩 (UTF-8, UNICODE 등)에 따라 다릅니다. 또한 VARCHAR를 저장하는 방법, 또는 NVARCHAR은 사용자가 보는 것에 마지막으로 말을합니다.

이 비슷한 질문에 here 더있다

편집 @ 마크

이 간단한 테스트를 시도 : 이것은 해당 문자가 "로 승리 저장된 의미

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 

를? " 이 테스트에서.

see이 표시되면보고있는 앱이 무엇을 인쇄해야하는지 잘 모르고 있음을 의미합니다.

또한 OP는 아마도 쿼리를 사용하여 char이 무엇인지 알아낼 필요가 있음을 의미합니다. 또한 like처럼 출력 된 문자열은 다른 문자로 구성 될 수 있음을주의하십시오.

CHAR (63)은 단지 예일 뿐이지 만,이 바로 당신이 ASCII table 표준 심문이 될 것입니다. 지금 당장에 깊이 파고하지만 아래의 테스트에 시간

편집 @Bridge

하지 않음이는 Unicode replacement character symbol입니다

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 
+0

'char (63)'은'?'가 아니라' '입니다. –

+0

@MarkRotteveel 꽤 관련이 있지만 내 편집을 참조하십시오 – jean

+4

이 문자는 ASCII 범위 밖에 있습니다. 대신에 'UNICODE'를 사용해야합니다. '아스키 (' '), CHAR (아스키 (' ')), 유니 코드 (N' '), NCHAR (유니 코드 (N' '))' – Bridge