본문 바로가기

경험

[DB] Incorrect string value: '\xF0...' - 이모지 저장 시 에러

Too Busy;DR 😁🙏🥹❤️‍🔥

  • utf8에서 이모지를 저장하려 할 때 뱉는 오류이다. 
  • DB의 인코딩 방식을 utf8mb4로 지정해준다.
  • + Connection에서도 utf8mb4로 지정해주는 것을 잊지 않는다.

 

환경

nodeJs / MySQL / promise-mysql(라이브러리) 요정도?


배경지식

1. UTF8은 1~4바이트의 가변 바이트를 가짐으로써 용량을 절약했다.

2. MySQL에서는 UTF8을 3바이트 가변 자료형으로 설계했다. (모든 언어가 21bit에 저장되기 때문)

 

3. 이모지4바이트를 갖는다.

=> mysql의 utf8 인코딩으로는 이모지를 저장할 수 없다..!

 

4. UTF8mb4는 UTF8과 비슷하지만 확장된 문자를 지원하기 위해서 4바이트까지 저장할 수 있는 Charset이다.

=> 🎉 mysql의 utf8mb4 인코딩으로 이모지를 저장할 수 있다..! 🎉


이슈

 에디터에서 이모지를 입력할 때에 오류가 발생했다.

그래서 체크했다. 입력하는 테이블의 인코딩 방식이 utf8mb4로 되어있는지!

그런데, 놀랍게도, utf8mb4로 되어있는 것이 아니겠는가.. 😱

 

 이슈는 이러했다. 아래 사진을 보면 charset이 utf8로 되어있다.

MySQL은 utf8mb4를 지원하지만 node와의 연결에는 utf8만 지원하는 상황이라고 할 수 있을 것이다.

띠용~~

답은 간단했다. charset을 utf8mb4로 변경해서 해결했다~!~!

 

필자처럼 굳이 node가 아니더라도 connection의 charset까지 확인하기를!

그리고 해결하기를!


참고

https://blog.lael.be/post/917

https://stackoverflow.com/questions/13653712/java-sql-sqlexception-incorrect-string-value-xf0-x9f-x91-xbd-xf0-x9f