[Oracle] DB 이모지 저장하기 - NVARCHAR2
오라클(Oracle) 데이터베이스를 사용하는데
이모지(이모티콘)가 저장이 안 된다... 😥
그래서 오라클 DB에서 이모지 저장하는 방법을 공유하려고 한다.
오라클 버전, 통신 방법 등 환경에 따라 상이할 수 있다.
환경 정보
JavaScript
Java JDK 1.8
Oracle Database 19c
1. 오라클 데이터 타입 설정 (NVARCHAR2)
이모지(🖐)는 일반적으로 Unicode 문자를 지원하는 데이터 형식을 사용해야 한다.
내가 사용 중인 오라클 버전의 경우 데이터 타입 NVARCHAR를 사용해야 정상적으로 이모지가 저장 된다.
(VARCHAR2는 하나의 문자에 3byte를 저장하는데 이모지는 4byte로 표현된다.)
이미 테이블 생성을 했다면 컬럼의 데이터 타입을 변경해 주자.
ALTER TABLE TABLE_TEST MODIFY IMOJI_TEST NVARCHAR2(20);
MySQL에서는 캐릭터 셋을 utf8mb4로 지정해 주면 잘 저장되는 것 같다.
CREATE TABLE `imoji_test` (
`imoji_test` varchar(15) CHARACTER SET utf8mb4
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='이모지 테스트';
2. 문자열 Byte 변환
2번, 3번 작업은 상황에 따라 하지 않아도 될 수도 있지만
내 경우 서버에 데이터를 전송할 때 이모지가 깨지는 현상이 있어 추가작업이 필요했다.
프론트에서 문자열(이모지 포함)을 입력받아 서버에 전달하기 전에 Byte 형식으로 변환한다.
String을 Byte로 UTF-8 형식으로 변환하는 메소드를 하나 만들어서 사용했다.
function stringToUtf8Bytes (text) {
var encoder = new TextEncoder();
var binary = encoder.encode(text);
return JSON.stringify(Array.from(binary));
}
stringToUtf8Bytes('이모지 변환 테스트 😀😁');
[출력]
'[236,157,180,235,170,168,236,167,128,32,235,179,128,237,153,152,32,237,133,140,236,138,164,237,138,184,32,240,159,152,128,240,159,152,129]'
이렇게 변환된 데이터를 서버로 전송한다.
3. Byte 문자열 변환
프론트에서 Byte로 변환한 데이터를 서버에서는 다시 String 문자열로 변환해 준다.
public static String byteToString(String text) {
String str = "";
try {
ObjectMapper mapper = new ObjectMapper();
byte[] serializedBytes = text.getBytes("UTF-8");
byte[] byteArray = mapper.readValue(serializedBytes, byte[].class);
Charset charset = StandardCharsets.UTF_8;
str = charset.decode(ByteBuffer.wrap(byteArray)).toString();
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
byteToString(paramMap.get("IMOJI_TEST"));
다시 문자열로 변환한 데이터를 DB에 저장한다.
4. DB 데이터 확인
위 내용대로 잘 진행했다면 이모지 저장이 잘 되는 것을 확인할 수 있다.
위에서도 언급했듯이 각자의 개발 환경에 따라 이모지 저장이 문제없이 저장이 될 수도 되지 않을 수도 있다.
- 데이터베이스 버전
- 데이터 타입
- CHARACTER SET
- 서버 통신 방법
이외에도 여러 이유가 있을 수 있고 잘 확인해서 대응하면 될 것 같다.