우리 프로젝트에서 db에 이모지가 들어가야 한다는 사실을 깨달았고, 이모지가 지원되는 utf8mb4로 이동해야 한다는 것을 발견했다.
기본적인 내용은 아래의 블로그를 따라가면 된다. 하지만 내가 고생했던 부분과 팁을 첨부해 글을 적어 놓으려고 한다. 참고로 mysql 5.6이상만 utf8mb4를 지원한다. 우리는 다행히 5.6.6을 사용하고 있었다.
How to support full Unicode in MySQL databases
기존에 디폴트 파라미터 그룹을 사용했다면, 새로운 amazon rds 파라미터 그룹을 생성하여 거기에 설정해 준다.
설정은 각 블로그마다 달랐지만, 기본적으로는 character_set과 collation과 관련 파라미터를 모두 utf8mb4, utf8mb4_unicode_ci로 설정하면 된다.
블로그에 있는 글을 참고하면
http://jinolog.com/programming/mysql/2011/03/21/character-set-and-collation.html
문자셋(Character set)은 각 문자가 컴퓨터에 저장될 때 어떠한 '코드'로 저장될지에 대한 규칙의 집합을 의미하며 콜레이션(Collation)은 특정 문자 셋에 의해 데이터베이스에 저장된 값들을 비교 검색하거나 정렬 등의 작업을 위해 문자들을 서로 '비교' 할때 사용하는 규칙들의 집합을 의미한다.
이라고 한다.
만든 파라미터 그룹을 해당 디비에 적용한 다음 재부팅 반드시 잊지말자! 재부팅을 안할 시 해당 설정이 제대로 안먹는 경우도 발생한다.
먼저 아마존의 파라미터 그룹 설정이 잘 적용되었는지 확인한다.
show variables like'char%'
잘 적용되지 않았을 경우에는 해당 파라미터에 대해 set 'Variable_name'=utf8mb4를 이용해 적용한다.
만약 디비를 새로 생성하는 것이라면 괜찮지만, 기존 디비에서 설정을 바꿔야 할 경우에는 추가적인 작업이 필요하다. 맨 처음 블로그를 보면 일일히 모든 디비, 칼럼, 테이블을 이렇게 설정하라고 나와 있다. 디비정도는 괜찮지만, 테이블, 칼럼에 대해서는 너무 노가다인게 사실이다.
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a VARCHAR
column.)
따라서 아래의 쿼리문을 이용하면 테이블의 설정을 간편하게 바꿀 수 있다.
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database_name' AND TABLE_TYPE != 'VIEW';
하지만 칼럼에 대해서는 답이 없다. 해당 칼럼마다 특성이 다르기 때문에 일반적인 쿼리문을 작성하기 어렵기 때문이다. 따라서 일일히 위처럼 해준다...
지금까지 적용한 속성들을 다 확인하기 위한 쿼리문이다.
##디비 설정 확인
select * from information_schema.SCHEMATA S;
## 해당 테이블에 대한 칼럼 설정 확인
SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_name = 'posts';
## 모든 테이블에 대한 칼럼 설정 확인
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
하지만 datagrip에서 이모지가 들어간 row를 넣으려고 하면 ?로 변환된다.. mysql의 설정이 안먹어서 그런 줄 알았는데 그냥 datagrip이 utf8mb4를 지원하지 않는 것 같아 별도의 datagrip gui설정이 필요한 것 같다.