[MySql] 데이터베이스에 이모지 문자 저장하기

Wooki·2023년 1월 31일
4

트러블슈팅

목록 보기
3/3

블로그 사이트 제작 중에 포스트의 내용을 MySQL DB에 저장하려는데
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD 라는 오류가 발생했다.

"Incorrect string value: '\\xF0\\x9F\\x92\\xAC\\xF0\\x9F...' 
for column 'contents' at row 1"

sql 에러 메시지는 위와 같아서 string 인식에 문제가 있나? 살펴보던 도중
테스트 데이터에 💬 <- 요 이모지가 포함되어 있는것을 보고 혹시 이게 문젠가 하고 이모지를 빼 보니 db query가 정상적으로 이뤄졌다.

ER_TRUNCATED_WRONG_VALUE_FOR_FIELD

구글링으로 해당 에러와 관련해서 이모지 입력과 관련이 있는지 검색해 본 결과
기본 MySQl 인코딩 방식이 UTF8로 되어있지만 MySql에서는 3byte 이내의 문자만 인식할 수 있다 하지만 이모지는 4byte를 사용하는 문자라서 MySQL의 인코딩을 utf8mb4로 변경해줘야 한다고 한다.

데이터베이스 문자열 변경

ALTER DATABASE 데이터베이스명 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

테이블 문자열 변경

ALTER TABLE 테이블명 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

바꿨는데.. 왜 안되ㄴㅑ....

혹시 DB의 인코딩이 변경되지 않은건가...? 하고

SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA 
WHERE schema_name = "데이터베이스명";

위 명령을 통해서 DB의 Encoding을 확인해 봤는데

분명 적용은 잘 되었다.. 혹시 몰라 테이블에 적용된 encodign 도 확인해 봤다.

SHOW FULL COLUMNS FROM 테이블명;

테이블의 문자셋이 utf8mb4_0900_ai_ci가 적용되어 있었다. utf8mb4_unicode_ci로 설정되지 않았던 것이다.

ALTER TABLE posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

그래서 alter table을 이용해서 테이블 자체의 문자셋을 바꿔보려고 시도했다.

ERROR 3780 (HY000): Referencing column 'writer' and referenced column 'userId' in foreign key constraint 'posts_ibfk_1' are incompatible.

에러가 발생했다.
이 테이블의 writer 속성이 다른 테이블의 userId 속성을 외래 키로 참조하고 있어서 에러가 발생헀다 라는 의미로 보인다.

해결?

구글링을 해 봤는데 테이블 두개를 동시에 수정하는 방법은 못찾겠고, 그냥 간단하게 외래키 제약조건을 삭제하고 다시 설정하기로 했다.

alter table 테이블명 drop foreign key 제약조건명;

외래키를 삭제하고 다시

ALTER TABLE 테이블명 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

를 이용해서 테이블의 문자셋을 변경한 후

SHOW FULL COLUMNS FROM 테이블명;

테이블에 적용된 문자셋을 확인하니

정상적으로 적용되었다! 아싸리..

이후 외래키도 다시 설정해 주었다.


될줄 알았지?

이제 다시 클라이언트에서 이모지가 포함된 문자열을 전송해 봤다

이젠 되겠지 .. 했는데

똑같다...

이것저것 시도해 보다가 ❤️ 이런 일부 이모지는 되는걸 확인했는데
💬 얘는 여전히 안된다..

진짜 해결

구글링을 해도 대부분 위 방법으로 문제없이 해결된다는 답변만 대부분이라서 어디가 문제일지 고민하다가 한 게시글을 발견했다.

https://joypinkgom.tistory.com/231
감사합니다..

클라이언트에서 서버로 넘겨줄 때 문자셋이 utf8mb4가 아니라서 서버에서 DB로 문자열을 전달 할 때의 charset도 변경해 줘야 한다는 것이다.

Express.js로 mysql과 연결할 때 문자셋 방식을 utf8mb4로 변경해줬다

charset : "utf8mb4"

다시 이모지가 포함된 포스트 내용을 전송해 보니 정상적으로 저장되었다!
db에서는 ?로 표시되지만 해당 데이터를 다시 받아서 확인해보면 정상적으로 표시되는 것을 확인했다.


참고

https://joypinkgom.tistory.com/231
3번 해결 방법

profile
웹 개발자

0개의 댓글