문제
서비스 운영 중 예약이 실패하는 오류가 발생했다. 서버 로그를 확인하니 이모지가 포함된 예약 메모를 데이터베이스에 저장하다가 오류가 발생한 것이다.
이모지다 😃
현재 사용하는 데이터베이스는 RDS - MySQL Aurora였고, 문자 인코딩 방식은 utf8를 사용하고 있었다. utf는 이모지 저장이 불가능한 방식이기 때문에 이모지 저장이 가능한 utf8mb4로 변경이 필요했다.
UTF-8 인코딩은 4바이트 가변 길이 인코딩 방식입니다. 그런데 MySQL에서는 utf8을 3바이트로 구현했었습니다. 그러다가 MySQL 5.5.3 (2010년 3월 24일)에 4바이트짜리 character set인 utf8mb4을 추가했습니다.
유니코드 U+10000 이상인 문자들을 UTF-8로 인코딩하려면 4바이트가 필요한데 이에 해당하는 대표적인 문자가 이모지(Emoji)다
해결
utf8mb4 설정을 적용하기 위해서 AWS의 RDS - 파라미터 그룹으로 이동한다.
그리고 RDS가 사용 중인 파라미터 그룹을 다음과 같이 변경한다. 이때, 몇 가지 주의점이 있으니 뒤에서 살펴보자.
#utf8mb4로 변경
character-set-client
character-set-connection
character-set-database
character-set-filesystem
character-set-results
character-set-server
#utf8mb4_general_ci로 변경
collation_connection
collation_server
주의1!
이때 디폴트 파라미터 그룹은 수정할 수 없다. 디폴트 파라미터 그룹을 수정할 경우 다음과 같은 오류가 발생한다.
cannot modify a default parameter group.
RDS가 디폴트 파라미터 그룹을 사용할 경우에 새로운 파라미터 그룹을 생성한 후, 위 설정을 적용하자.
주의2!
RDS에 이미 적용되어 있는 파라미터그룹의 설정을 변경하면 오류가 발생할 수 있다. RDS에 적용된 파라미터그룹을 다른 것으로 변경한 후, 설정을 변경하도록 하자.
저장 중 오류: This parameter group [파라미터그룹이름] cannot be modified because it is currently being applied to DB Instance deeping (Service: AmazonRDS; Status Code: 400; Error Code: InvalidDBParameterGroupState; Request ID:
주의3!
설정을 변경한 후에는 RDS를 재시동해야 적용된다.
다음으로 RDS에 명령을 보낼수 있는 환경에 접속한다. 여기서는 MySQL Worbench를 사용한다. 그리, 다음과 같이 입력하여 생성되어있는 데이터베이스에 추가적으로 설정을 적용한다.
ALTER DATABASE [데이터베이스명] CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci' ;
마지막으로 다음 명령어로 모든 설정이 올바르게 적용 되었는지 확인한다.
show variables like 'c%';
설정을 마치고 테이블에 이모지를 입력하면 정상적으로 입력된다.
출처
스프링 부트와 AWS로 혼자 구현하는 웹 서비스
blog.gangnamunni.com/post/aws-rds-mysql-utf8mb4/
medium.com/oldbeedev/mysql-utf8mb4-character-set-설정하기-da7624958624
'AWS > RDS' 카테고리의 다른 글
[AWS] RDS_MySQL 오류 해결: Could not send query: query size is >= to max_allowed_packet (0) | 2021.04.19 |
---|---|
[AWS] Amazon RDS 시작하기 및 MySQL 워크벤치 연결하기 (2) | 2020.12.31 |
[AWS] RDS 제품 스펙 업그레이드 하기 (0) | 2020.10.16 |
[AWS] RDS 백업 및 사용하기(스냅샷) (0) | 2020.10.16 |
댓글