시스템을 운영하다 보면, 사용자들이 이모티콘이 포함된 데이터를 저장하는 경우가 종종 있다.
내가 운영하는 시스템 DB는 AWS RDS에 구축되어 있고, MySQL을 사용하고 있으며 charset은 기본적으로 uft8이다.
utf8에서는 유니코드 버전이 낮은 이모티콘 (예시: 😀) 등은 문제 없이 INSERT가 가능하지만, 유니코드 버전이 높은 이모티콘 (예시: 💖) 를 INSERT하려고 하면 다음과 같은 오류가 발생한다.
유니코드 버전이 낮은 초기 이모티콘들은 3byte로 설계되어 있지만, 이모티콘의 숫자가 늘어나면서 유니코드 버전이 높은 이모티콘은 4byte로 설계되어 있기 때문에 그렇다고 한다.
이를 정상적으로 Insert 하기 위해서는 utf8mb4로 charset, collation 변경이 필요하다.
(관련 StackOverflow 문서: https://stackoverflow.com/questions/30074492/what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysql)
검색해봤을 때에는 대부분 Linux에 DB가 구축되어 있는 경우라 my.cnf를 수정하고 DB를 재기동하라는 정보들 뿐이었다. AWS RDS의 경우에는 AWS Console에서 관련 parameter를 수정해 주어야 한다.
AWS Console에 접속해서 RDS 관리 페이지로 들어간 후, 해당 DB 인스턴스를 선택하면 다음과 같은 화면이 보인다.
구성 - 파라미터 그룹에 접속한다.
파라미터 그룹에서 char, collation을 검색한 후 관련 값을 모두 utf8mb4, utf8mb4_general_ci로 변경해준다.
utf8mb4_general_ci, utf8mb4_unicode_ci 중 어떤 것을 사용해야 할 지 고민했는데, 해당 테이블은 다른 DB로 인터페이스를 하고 있고 다른 DB의 collation이 utf8mb4_general_ci이기 때문에 해당 collation을 선택했다.
검색을 해보다 관련해서 좋은 글도 발견했다.
What's the difference between utf8_general_ci and utf8_unicode_ci?
Between utf8_general_ci and utf8_unicode_ci, are there any differences in terms of performance?
stackoverflow.com
현재 기준 utf8_unicode_520_ci 를 사용하는 것을 권장한다고 한다. 사용해보고 싶지만... 일단 해당 프로젝트의 표준?? 이 그렇지가 않아서 utf8mb4_general_ci를 사용하기로 했다.
다음과 같이 설정한 후, DB 인스턴스를 재부팅해준다.
만약에 해당 설정 이전에 생성된 테이블이라면, 테이블과 컬럼의 charset, collation도 변경해줘야 한다.
MySQL은 테이블과 컬럼의 charset, collation이 각자 존재하던데 왜 이런지는 공부를 해 봐야겠다.... 개인적으로는 전혀 납득이 가지를 않는 방식... 😅
다음과 같은 방법으로 현재 테이블, 컬럼의 charset을 확인할 수 있다.
# 테이블
SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,
information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_schema = "schemaname"
AND T.table_name = "tablename"
# 컬럼
SELECT character_set_name FROM information_schema.`COLUMNS`
WHERE table_schema = "schemaname"
AND table_name = "tablename"
해당 값들도 모두 utf8mb4, utf8mb4_general_ci 로 맞춰줘야 한다.
ALTER TABLE tablename
MODIFY COLUMN columnname VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_general_ci
설정을 완료하면 정상적으로 이모티콘이 삽입된다. 💖
+ 22.07.12 추가
AWS RDS parameter group에서 적용 유형이 dynamic이면 재기동 없이 반영이 가능하다고 한다.
charset, collation 관련 parameter들의 적용 유형은 분명히 dynamic인데, 왜 재기동 전에 반영이 되지 않은 지는 모르겠다..
'공부 > SQL' 카테고리의 다른 글
[MySQL] 여러 row의 데이터를 한 row에 합치기 - GROUP_CONCAT (0) | 2022.09.13 |
---|---|
[MySQL] 개인정보 (휴대폰번호, 이름) 마스킹 처리 (0) | 2022.05.31 |