2017-12-08 1 views
1

SQL Server 테이블에 nvarchar (max) 열이 있습니다. 이 열에 '제거'문자열이 포함 된 모든 행을 선택하는 쿼리를 실행했습니다. 결과 사이에, 나는이 열이 빈 문자열로 채워지는 몇 개의 행을 가지고 있는데 왜이 값들이 반환되었는지 이해할 수 없습니다.SQL에서 LIKE 조건과 일치하는 빈 문자열 변수

반환 된 빈 문자열 값 중 하나를 조사해 보았습니다. 빈 문자열 값이 특정 LIKE 조건과 일치하지만 다른 조건은 일치하지 않는 것으로 나타났습니다. 예를 들어 '% remove %'및 '% x %'과 (와) 일치하지만 '% q %'과 (와) 일치하지 않습니다.

SQL Server Management Studio의 결과 그리드 내에서 nvarchar 필드는 빈 필드 (null이 아님)로 표시됩니다. 그러나이 필드에 len() 함수를 적용하면 649 값이 반환됩니다. 결과 테이블을 SQL Server Management Studio에서 Excel로 내보낼 때 nvarchar (max) 필드가 비어 있습니다.

필드를 채우는 공백 문자가 있어야한다고 가정하고 반환 된 값의 양쪽 끝에 'x'를 연결 한 후 필드를 선택하려고했습니다. 결과에서 선행 'x'는 문자열의 시작 부분에 나타나지만 끝에 연결된 'x'는 표시되지 않습니다.

나는 무슨 일이 벌어지고 있는지 완전히 혼란 스럽다. 요청에 따라 더 많은 정보를 제공 할 수 있습니다. 문자 수를 변경하지 않는 필드를 트리밍

:

select itemid, content 
from objects 
where itemid = 100 and content like '%remove%' 

---------------- 


itemid | content 
100  | 

select itemid, 'x' + content + 'x' as 'content' 
from objects 
where itemid = 100 and content like '%remove%' 

---------------- 


itemid | content 
100  | x 

편집

. 그러나 연결된 출력에서 ​​마지막 문자를 선택하기 위해 하위 문자열을 사용하는 경우 반환되는 문자는 'x'로, 문자열의 길이 때문에 GUI 출력에 표시되지 않습니다. 그래도 Excel에 내용을 내보낼 때이 후행 'x'문자를 볼 수 없습니다. 아마도 지원되지 않는 문자가 nvarchar 변수 내에 존재한다고 생각합니다.


select itemid, 'x' + ltrim(rtrim(content)) + 'x' as 'content' 
from objects 
where itemid = 100 and content like '%remove%' 

---------------- 


itemid | content 
100  | x 
+0

나는 재생할 수 없다. 정확히 같은 조건으로 테스트를 해 보셨나요? –

+0

[이 동작을 재현 할 수 없음] (http://rextester.com/GQUP34325). 재현 가능한 샘플을 제공 할 수 있습니까? –

+2

필드에서 LTRIM()을 사용해 보셨습니까? 그러면 문자열의 왼쪽에서 선행 공백이 제거됩니다. LEN (LTRIM (RTRIM (content)))을 분석 할 수도 있고, 앞뒤 공백을 제거하고 길이를 제공합니다. –

답변

1

내 생각에 문자열에 일부 제어 문자가있는 것 같습니다. 예를 들어 첫 번째 문자가 개행 문자 인 경우 나머지 문자는 표시되지 않을 수 있습니다. 그래서

unicode(substring(item, 2, 1)) 

과 :

은 당신이 두 번째 문자를 볼 수있는 첫 번째 문자에 대한 유니 코드 코드 포인트를 표시합니다

select item_id, unicode(content) 
from objects 
where item_id = 100; 

을보십시오.

+0

나는이 문제의 원인에 대해 당신이 맞다고 생각합니다. 반환 된 문자열 값의 모든 문자에 대해 유니 코드 함수를 실행했으며 유니 코드 값의 범위는 0에서 121까지입니다. 이 컨텍스트에서 유니 코드 문자와 그 호환성에 대해서는 잘 모릅니다. 내가 관찰 한 것은 문자열에 지원되지 않는 문자가 있다는 것을 확인 했습니까? 아니면 추가 정보를 제공해야합니까? –

+0

https://en.wikipedia.org/wiki/UTF-8 또는 http://www.utf8-chartable.de/unicode-utf8-table.pl 또는 http : //www.thedatastudio를 참조하십시오. net/character_encoding_profile.htm을 사용하여 유니 코드 코드 포인트를 확인하십시오. 더 낮은 값 (U + 0000부터 U + 001F까지)은 제어 문자이므로 눈에 보이지 않지만 디스플레이와 혼란을 야기합니다. –

1

나는 당신이 열을 손질해야한다 생각한다;

select itemid, LTRIM(RTRIM(content)) 
from objects 
where itemid = 100 and content like '%remove%' 
관련 문제