mysql 공식문서에 따르면 collation 디폴트 값은 utf8mb4_0900_ai_ci입니다.
The default MySQL server character set and collation are utf8mb4 and utf8mb4_0900_ai_ci
필자는 아래와 같은 과정으로 aws RDS에 mysql DB을 올려놨습니다.
mysql 워크벤치를 통해 ERD을 만들고 forward를 통해 로컬 db와 동기화를 시켜줬습니다.
그 다음 sequelize-cli의 seed 명령어를 통해 데이터를 생성해줬습니다.
서버 내부에서는 sequelize-auto를 사용해서 만들어진 데이터베이스 구조를 사용했습니다. 이 구조에 charset, collate 옵션을 utf8mb4, utf8mb4_general_ci로 줬었습니다.
이후 mysql 워크벤치의 export를 통해 데이터베이스 구조와 내용을 내보내고
aws RDS를 워크벤치로 연결한 뒤 import 해줬습니다.
처음에 이모지를 허용해주기 위해 sequelize의 utf8mb4_general_ci로 설정했던 게 문제였지 않나 싶습니다. '
나중에 general_ci가 구식임을 알게 된 뒤 unicode_ci로 변경했었습니다.
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '='
이런 에러를 만났고 해결이 필요했습니다.
많은 stack overflow를 뒤진 뒤 대략 3가지 명령문들을 발견했습니다.
- connection
- database
- table
들에서 변경이 필요하다 여겨 다 해봤습니다.
워크벤치에서 aws rds DB에 연결한 뒤 query에 직접 쿼리문을 작성했습니다.
SET collation_connection = 'utf8mb4_unicode_ci';
ALTER DATABASE tuto CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE category CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE comment CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE lecture CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE portfolio CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE portfolioImage CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE recomment CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tutorial CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
그 뒤 user의 닉네임에 이모지를 넣어 회원가입 시켜봤더니 이제 에러가 안 뜨게 됐습니다.
데이터베이스에도 잘 저장된 걸 확인할 수 있습니다.
'DB' 카테고리의 다른 글
mariaDB sql문 초보가 저지르는 실수 (foreign key) (1) | 2021.10.25 |
---|---|
MongoDB를 써보다. 장점과 단점 (0) | 2021.08.11 |