콘텐츠로 건너뛰기
리뷰나라
  • JAVASCRIPT
  • JAVA
  • PYTHON
  • C#
  • Android
  • Html

[sql-server] LIKE 식에서 안전하게 사용할 수 있도록 SQL Server에서 문자열을 이스케이프합니다.

Program / 글쓴이 어드민

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

다음 NVARCHAR과 같은 변수 가 있다고 가정합니다 .

declare @myString NVARCHAR(100);

그리고 LIKE식에서 사용하고 싶습니다 .

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

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

예를 들면 다음과 같습니다.

@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에 비해 구문 탈출 대괄호로 모두CHARINDEX 와 키워드 .ESCAPE


답변

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


답변

이스케이프 문자가 포함 된 문자열을 찾으시겠습니까? 예를 들어 다음을 원합니다.

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

10 %가 포함 된 모든 필드를 어디에서 검색 하시겠습니까? 이 경우 ESCAPE 절을 사용하여 이스케이프 문자를 지정하고 와일드 카드 문자를 이스케이프 할 수 있습니다.

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


답변

대체 이스케이프 구문 :

LIKE 와일드 카드 리터럴

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

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

db <> 바이올린 데모


답변




글 탐색

← 이전 글
다음 글 →

최신 글

  • [java] .pem 파일을 읽고 개인 및 공개 키를 얻는 방법
  • [javascript] 페이지의 모든 AJAX 요청에 “후크”추가
  • [android] ListView가 접히지 않고 어떻게 ScrollView에 넣을 수 있습니까?
  • [linux] Apache 서버의 루트 디렉토리를 어떻게 변경합니까? [닫은]
  • [ios] Swift에서 Int를 Hex String으로 변환하는 방법
  • [python] 등급 시스템 기능에서 반복적 인 if-elif 문을 어떻게 단순화 할 수 있습니까?
  • [c#] C #에서 스택 오버플로 예외 포착
  • [windows] Windows의 /usr/local/ssl/openssl.cnf에서 구성 정보를로드 할 수 없습니다
  • [twitter-bootstrap] Bootstrap을 사용하여 모바일에 테이블을 표시하는 방법은 무엇입니까?
  • [windows] BATCH 스크립트에서 무작위로 사용하는 방법은 무엇입니까?

카테고리

태그

.net android angular angularjs arrays asp.net asp.net-mvc bash c c# css database django docker html ios iphone java javascript jquery json linux macos mysql node.js objective-c pandas php postgresql python r reactjs regex ruby ruby-on-rails shell sql sql-server string swift typescript unix visual-studio windows xcode
Copyright © daplus.net - Powered by Naya