오라클 LIKE 검색을 자바에서 하는경우 오류 0 6 4,954

by 코드 [어플리케이션관련] [2014.07.04 18:59:21]


안녕하세요.

자바에서 쿼리로 오라클 DB에 like 처리할때 문제가 있는데

원인을 모르겠네요.

 

 

1. 증상

자바에서 테이블 조회조건으로   like 검색을 시도    like '%' +   변수   +' %'
 

2. 결과

대부분 정상 동작하는데

 

20    30으로 검색하면

 

java에서 찍힐때는 정상적으로 나오는데

쿼리에서는           '변수%'   로 변경됨

 

 

예를 들어  20초  라는 검색어를 입력하면

 

쿼리에서는    like '초%'

라고 나옵니다.

 

혹시나해서  40초   같은걸 넣으면 정상적으로   like '%40초%'     이렇게 찍히네요

 

 

20,  30   두개 찾았는데

%20,   %30   이 의미하는게 어떤건가요?

이외에 어떤 문제되는 항목을 있을지와

처리 방법에 대하여 확인중입니다.

 

쿼리 가 자바에서 넘어가기 전에 찍으면   제대로  '% %'  가 찍히는데

쿼리 로그에서 보면 빠지네요

 

오라클 문제는 아닌거 같은데  어떻게 분석해야할지 조언 부탁드립니다.

by 마농 [2014.07.07 08:49:52]

보내는 쪽에서는 SQL쿼리를 인코딩하여 넘길 것이고,
받는 쪽에서는 디코딩하여 받을 것입니다.
이 때 %20 을 인코딩된 값으로 판단하여 공백으로 디코딩합니다.
이게 원인일 것이구요.
인코딩값으로 인지하여 디코딩 하지 않게 해야 합니다.
1. 자바에서 % 대신 다른 문자로 치환하여 넘겼다가
   받는 쪽에서 다시 언래의 % 로 치환하는 방법
2. 쿼리에서 '%' 를 제거하는 방법
   - 변경전 : " LIKE '%" + 검색어 + "%' "
   - 변경후 : " LIKE CHR(37)||'" + 검색어 + "'||CHR(37) "
3. 기타 더 좋은 방법은 없는지 검색해 보기


by 백면서생 [2014.07.07 11:39:01]

원인에 대해서 마농님께서 잘 말씀해주셨네요.

첨언하면

양방향 like 검색일 경우는 col like '%+검색어+%' 보다는 instr(col,+검색어+) > 0 이 성능상 더 유리합니다.

또한 위와 같은 %관련된 문제도 사라지겠죠.

그리고 가끔씩 일어나는 대용량의 배치 작업이 아니라 빈번히 일어나는 oltp성 작업이라면

바인드 변수를 사용하시는게 좋겠습니다.

instr(col,?) > 0


by 코드 [2014.07.07 14:44:32]

양방향 like 검색을 사용하는데

이게 특정 문자에서만 발생되는 문제라서 고민이였습니다.

발견한건   %20   %30   두개고

그외에는 모두 임의로 테스트할때 잘되더라고요

 

두분의 답변을 보고 2가지 처리 부분을 생각하려고 합니다.

 

1. clob 데이터를 조회하기 때문에 instr  로 처리하는게 유용하지 않을수 있음

2. 쿼리 호출 바로 직전 까지 출력하면  %20 %30 둘다 잘나오는데
   쿼리로 들어간 로그에서 해당부분이 누락됨 (마농님 1번이 안될수 있음)

 

마농님의 2번 답변처럼 검색할때 chr(37)로 변형처리하는게 잘돌아가는지 봐야 될거같습니다.

백면서생님 답변처럼 양방향이 있을 경우  instr  를 이용하는 방법을

써야겠네요

 

두분 답변 모두 감사드립니다


by 코드 [2014.07.07 18:19:44]

백면서생님
결국 처리해보니까  chr(37) 로 넘겨도 쿼리에서 결과문이 제대로 안나오네요.

쿼리를 돌려보면 원하는 결과를 얻지 못했습니다.

 

instr 을 이용한 방법으로 해결했네요

 

이스케이프 문자로 사용되는거라고 하면 다른 검색도 안되야 할텐데

이렇게 특정 문자에서만 발생되는건

인코딩 문제로 보는게 맞을까요?


by 백면서생 [2014.07.08 10:01:02]

네. 마농님 말씀 처럼 인코딩과 디코딩시의 오류로 보이네요.

template을 만들어 놓고 상황에 따라 sql을 넘겨 다른 내용을 전달한다던지 이런 이유가 아닌 이상

sql을 넘기는건 흔치 않아 보이네요.

보안상으로나 여러 이유로도 가능하시다면 해당페이지(template?)에 구분값을 넘겨 그 페이지에서

sql을 선택적으로 가져와 사용하시는게 좋아보입니다.

 


by 마농 [2014.07.08 10:33:09]

CHR(37) 로 넘기는게 왜 안될까요? 될것 같은데?

넘기기 전 SQL 찍어서 따로 실행 해보셨나요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입