2023년 10월 11일 수요일

MySQL 'SQLSyntaxErrorException: You have an error in your SQL syntax' 역슬래시(,backslash) 에러내용 정리

SAP PO와 MySQL 연계 인터페이스에서 역슬래시(₩,backslash)데이터로 인해 발생된 에러에 대해 정리해보았습니다.

최초 에러내용은
Unable to execute statement for table or stored procedure. '[테이블명]' (Structure '[상위노드명]' due to java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near...

Receiver JDBC Adapter의 채널 접속정보 셋팅은
jdbc:mysql://[아이피]:[포트]/[서비스네임]?serverTimezone=Asia/Seoul&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&autoReconnect=ture
이렇습니다.

전에 정리했던 'SAP PO에서 UTF8B4 데이터처리를 어떻게 해야할까?' 내용에서의 셋팅이 기억이 나서 혹시나 characterEncoding=utf8 → utf8mb4로 변경해서 테스트해보니 에러가 나는군요..
JDBC message processing failed; reason Error when attempting to get processing resources: com.sap.aii.af.lib.util.concurrent.ResourcePoolException: Unable to create new pooled resourace: DriverManagerException: Cannot establish connection with the registered driver. com.mysql.jdbc.Driver returns: Unsupported character encoding utf8mb4.: SQLException: Unsupported character encoding utf8mb4

최초 에러같은경우 역슬래시 데이터만 있어도 에러가 발생되는데 이것을 ₩₩이렇게 붙여주면 정상적으로 처리됩니다.

그래서 관련 내용을 찾아보니
타겟테이블 컬럼 타입은 모르겠지만 백슬래시(₩)데이터가 이스케이프 문자로 사용되어 문법에러가 발생되는것같고 해결을 위한 방안으로 아래와 같이 생각을 정리해 보았습니다.
  1. 소스쪽에서 데이터 수정이나 제거
  2. PO에서 백슬래시 데이터에 대한 처리
  3. 타겟쪽 MySQL의 서버설정이나 컬럼타입 변경

소스에 대한 처리는 SOAP이나 REST같은 HTTP/S연계방식에서는 CDATA로 감싸서 보내는 경우가 있는데 DB방식 같은 경우 데이터 제거나 수정이 필요해보이고 화면에 사용자가 입력하는 데이터라면? 인터페이스 전송 전에 해당 문제 데이터를 차단하거나 ₩ → ₩₩ 이런 작업이 필요해 보입니다.

PO에서도 이런 유사한 문제로 타겟쪽 DB의 모드변경이나 펑션을 사용하는 경우도 있어서 mysql_real_escape_string()를 매핑에 추가하여 문제데이터로 테스트를 해보았지만 안되었습니다.

타겟 DB에서는 NO_BACKSLASH_ESCAPES라는게 있다는데 테스트를 해보지 않아서 결과를 모르겠지만 이 모드르르 해제하는 경우 이스케이프 데이터를 스트링 데이터로 사용되게 해주는것 같습니다. 

참고사이트
5.1.10 Server SQL Modes
[MySQL API] mysql_real_escape_string() - 커피와 개발자
9.1.1 문자열 리터럴

댓글 없음:

댓글 쓰기

최근글

9월 태안~천안 아이와 3박4일 가족 여행지