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
최초 에러같은경우 역슬래시 데이터만 있어도 에러가 발생되는데 이것을 ₩₩이렇게 붙여주면 정상적으로 처리됩니다.
그래서 관련 내용을 찾아보니
타겟테이블 컬럼 타입은 모르겠지만 백슬래시(₩)데이터가 이스케이프 문자로 사용되어 문법에러가 발생되는것같고 해결을 위한 방안으로 아래와 같이 생각을 정리해 보았습니다.
- 소스쪽에서 데이터 수정이나 제거
- PO에서 백슬래시 데이터에 대한 처리
- 타겟쪽 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 문자열 리터럴
댓글 없음:
댓글 쓰기