programing

LIKE 식에서 안전하게 사용할 수 있도록 SQL Server에서 문자열 이스케이프

bestprogram 2023. 5. 12. 22:47

LIKE 식에서 안전하게 사용할 수 있도록 SQL Server에서 문자열 이스케이프

SQL Server의 저장 프로시저에서 안전하게 사용할 수 있도록 문자열을 이스케이프하려면 어떻게 해야 합니까?LIKE표현.

내가 가지고 있다고 가정해 보세요.NVARCHAR다음과 같은 변수:

declare @myString NVARCHAR(100);

그리고 저는 그것을 사용하고 싶습니다.LIKE식:

... WHERE ... LIKE '%' + @myString + '%';

문자열을 이스케이프하려면 어떻게 해야 합니까(더 구체적으로, 다음에 의미 있는 문자)LIKE패턴 일치(예:%또는?) T-SQL에서 이러한 방식으로 사용하는 것이 안전합니까?

예를 들어, 다음과 같습니다.

@myString = 'aa%bb'

원하는 항목:

WHERE ... LIKE '%' + @somehowEscapedMyString + '%'

어울리게'aa%bb','caa%bbc'하지만 아닙니다.'aaxbb'또는'caaxbb'.

LIKE 식에서 특수 문자를 이스케이프하려면 이스케이프 문자로 접두사를 붙입니다.ESCAPE 키워드와 함께 사용할 이스케이프 문자를 선택할 수 있습니다. (MSDN 참조)

예를 들어 \를 이스케이프 문자로 사용하여 % 기호를 이스케이프합니다.

select * from table where myfield like '%15\% off%' ESCAPE '\'

문자열에 포함될 문자가 무엇인지 모르고 와일드카드로 처리하지 않으려면 모든 와일드카드 문자 앞에 이스케이프 문자(예:

set @myString = replace( 
                replace( 
                replace( 
                replace( @myString
                ,    '\', '\\' )
                ,    '%', '\%' )
                ,    '_', '\_' )
                ,    '[', '\[' )

(또한 탈출 차트를 탈출해야 하며, 그것이 내부인지 확인해야 합니다.replace그래서 당신은 다른 것에서 추가된 것들을 피할 수 없습니다.replace진술).그런 다음 다음과 같은 방법을 사용할 수 있습니다.

select * from table where myfield like '%' + @myString + '%' ESCAPE '\'

@myString 변수는 문자열을 교체하면 길이가 길어지므로 더 많은 공간을 할당해야 합니다.

비슷한 문제가 있었는데(NHibernate를 사용하므로 ESCAPE 키워드가 매우 어려웠을 것입니다) 괄호 문자를 사용하여 해결했습니다.그래서 당신의 샘플은

WHERE ... LIKE '%aa[%]bb%'

증거가 필요한 경우:

create table test (field nvarchar(100))
go
insert test values ('abcdef%hijklm')
insert test values ('abcdefghijklm')
go
select * from test where field like 'abcdef[%]hijklm'
go

패턴에서 선행 와일드카드를 사용하는 경우 패턴 구문에서 특별한 의미를 갖는 문자열의 모든 문자를 이스케이프하는 것보다 더 빠르고 쉽게 수행할 수 있습니다.

SELECT * 
FROM YourTable
WHERE CHARINDEX(@myString , YourColumn) > 0

선행 와일드카드를 사용하지 않는 경우 위의 접근 방식은 피해야 합니다. 그러나 인덱스를 사용할 수 없기 때문입니다.YourColumn.

또한 최적의 실행 계획이 일치하는 행의 수에 따라 달라지는 경우에는 사용 시 추정치가 더 나을 수 있습니다.LIKE및 키워드비교할 때 대괄호 이스케이프 구문을 사용합니다.

이스케이프 문자를 지정합니다.여기 설명서:
http://msdn.microsoft.com/en-us/library/ms179859.aspx

이스케이프 문자가 포함된 문자열을 찾으시겠습니까?예를 들어 다음과 같이 하십시오.

select * from table where myfield like '%10%%'.

10%로 모든 필드를 검색할 위치를 선택하십시오.그런 경우 이스케이프 절을 사용하여 이스케이프 문자를 지정하고 와일드카드 문자를 이스케이프할 수 있습니다.

select * from table where myfield like '%10!%%' ESCAPE '!'

대체 이스케이프 구문:

LIKE 와일드카드 리터럴

JDBC 드라이버는 LIKE 절 와일드카드를 리터럴로 사용하기 위한 {escape 'escape' 문자'} 구문을 지원합니다.

SELECT *
FROM tab
WHERE col LIKE 'a\_c' {escape '\'};

db<>디플 데모

언급URL : https://stackoverflow.com/questions/258757/escape-a-string-in-sql-server-so-that-it-is-safe-to-use-in-like-expression