타겟이 MYSQL에서 UTF8MB4관련 에러내용을 본적이 있습니다.
"Incorrect string value: '\xFO\x90\x8D\x83\...' for column '<column name> at row 1"
이전에도 PO매핑 등에서 데이터로 인한 에러가 발생된 경우는 있는데요. 요즘들어 이모지? 등과 같은 유니코드 U+10000이상인 데이터들 원인으로 인한 에러들을 자주 보게 되는것 같습니다.
소스, 타겟 DB나 테이블을 생성 시 서버단에 언어셋과 컬럼타입등을 동일하게 맞추고 인터페이스가 개발이 된다면 데이터로 인한 매핑에러는 거의 없을것 같은데 현실은 그렇지 않은것 같고 이런에러들을 PO안에서 해결을 해야할때가 발생되는것 같은데요. 인터넷에 찾아본 내용들을 간략하게 정리해보았습니다.
정확하지 않는 부분이 있는경우 댓글달아주시면 수정하겠습니다.
UTF8MB4데이터란?
몇년전만해도 들어보지 못한 케릭터 셋인데요. 보통 스마트폰이나 SNS에서 사용되는 이모지(Emoji)😅 등에서 사용되는 데이터들로 보입니다. 기존에 많이 사용되는 UTF8과의 인코딩방식의 차이는 MYSQL같은경우 가변3바이트인 반면에 UTF8MB4같은 경우 4바이트를 사용한다고 하며 둘다 다국어지원이 가능하지만 최근에 생긴 데이터(이모지, 확장한자 등)으로 인해 특정 DB에서 차이가 생긴것 같습니다.UTF8MB는 MYSQL이나 MariaDB에만 해당 된다고 하는데 아직까지는 다른 DB들에서는 이런 이모지 등 데이터로 인한 에러를 본적이 없습니다.
어떻게 처리해야할까?
신규DB라면 서버 케릭터셋 변경으로 해결이 가능할것 같은데요. 운영중인 DB라면 아래 문제로 인해 연계방식이라면 PO에서의 자바매핑 등 별도의 방법이 필요할것 같습니다."케릭터셋은 테이블에 데이터가 생성 후 부터 변경하려고 하면 데이터의 손실이나 그외 다른문제들이 발생될수 있어 처음 DB설계시 셋팅을 잘 하셔야될것 같습니다."
하지만 인터페이스 관점에서 운영중인 타겟DB와 연계하는 새로운 소스DB에서 UTF8MB데이터를 전송한다면? PO에서 해결해야하는 상황이 생기지 않을까 생각되기도 하며 DB연계보다 다른 SOAP, REST 등 방식을 더 선호하게 되기도 하네요.
만약 신규 타겟 MYSQL DB에서 이런 에러가 발생된다면? DB서버 케릭터셋을 확인 후 해당 담당자와 얘기해 UTF8MB4로 변경 요청 후 PO에서 SQLDML방식으로 'SET NAMES UTF8MB4'를 실행후에 데이터전송해보시는것도 좋을것 같은데요.
이건 인터페이스 별로 실행해줘야하는 부분이라 혹시 아래와 같이 MYSQL DB와 컨넥션 &characterEncoding=utf8를 추가한경우에는 확인을 안해봐서 모르겠지만 mysql-connector-java의 이전버젼인 5.1.31에서 5.1.49로 업그레이드 후에 해결이 된 사례도 존재하는것 같습니다.
PO의 JDBC 드라이버 버젼 확인은 아래 경로에서 확인 가능합니다.
NWA > JavaClassLoaderViewer > Component Type는 library선택 후 com.sap.aii.adapter.lib로 조회
jdbc:mysql://<host>:<port>/<dbname>?useUnicode=true&characterEncoding=utf8
PO의 JDBC 드라이버 버젼 확인은 아래 경로에서 확인 가능합니다.
NWA > JavaClassLoaderViewer > Component Type는 library선택 후 com.sap.aii.adapter.lib로 조회
만약 운영중인 DB라면.. 사용자가 넣은 이모지를 제거해달라고 할수도 없으니 PO에서 해결해달라는 요청을 받을수도 있을것 같습니다.
그외 확장된 문제로 인해 PO매핑의 XML에서 허용안하는 데이터로 인식을 못하는 경우가 있는데 관련 노츠도 확인이 되네요.
2252945-CJK Unified ldeographs Extension B Characters are converted to # in message mapping
댓글 없음:
댓글 쓰기