mysql의 Charset 중에는, utf8과 utf8mb4가 있습니다. utf8만 있으면 될 거 같은데. 왜 그럴까요? 친구랑 웹 페이지를 만들기 위해서 만들어 두었던 테이블을 가지고 간단하게 실험을 해 보도록 하겠습니다.

 

 

 딱 봐도, id라던지, address가 있는 걸로 보아서는, 회원 가입을 위한 테이블이라고 할 수 있어요. Character Set이 utf8로 되어 있는데요. 기본적으로 utf8은, 4byte 가변 인코딩이라고 할 수 있어요. 'a'나 'e'와 같은 문자들은 1byte로 표현이 되고, '경'이라던지 '산'이라는 것은 3byte로 표현이 됩니다.

 

 user_name의 Character Set은 utf8입니다. 우리는 member에서 user_name 필드만 출력해 보도록 하겠습니다.

 

 

 chogahui05와 똠방각하, 그리고 admin이 출력이 되었습니다. 그러면 'a'라던지 '똠'과 같은 1byte, 3byte로 인코딩이 되는 유니코드는 들어갈 수 있다는 소리입니다. 문제는, 4byte로 인코딩이 되는 녀석들인데요. 이들은 Charset이 utf8로 되어 있으면 어떻게 들어갈까요?

 

 


 쿼리문을 이렇게 작성해 봅시다.

 

 

 address에 뭔가를 넣은 거 같은데요. 이는 유니코드로 U+1F601로 표현이 되는 문자입니다.

 

 

 이것을 넣어보면, 0xF0 9F 98 81이 incorrect string value라는 에러가 뜨는데요. 이는 mysql의 utf8이 4바이트 가변 인코딩은 받지 못한다는 이야기가 됩니다. U+1F601은, 유니코드 값으로, 65536보다는 큰 문자인데요.

 

 

 그러면 3바이트로 인코딩 되지 못해요. 그러면 4byte로 인코딩이 될 건데요.

 

 

 U+1F601은, 0xF0 9F F8 81로 인코딩이 되니, UTF8로 인코딩이 되면, 4byte로 표현이 되는 셈인데, 그것이 들어가지 않았다는 이야기는 mysql에서 utf8로 설정이 되어 있다면, 3바이트로 표현되는 것까지 넣을 수 있다는 의미입니다. 유니코드 값으로 보면 U+0000부터 U+FFFF까지만 넣을 수 있다는 이야기에요.

 

 


 그러면 어떻게 하면 좋을까요? Character set을 utf8mb4로 바꾸면 됩니다.

 

 

 이는 table에서 열의 속성을 바꾸면 됩니다. collate는 utf8mb4_unicode_ci로 설정했습니다.

 

 

 표를 보시면, address 필드에 대한 두 가지 정보가 바뀌었음을 알 수 있어요.

 

 

 그러면, 이 문자를 넣어봅시다. U+1F62D도 역시, slack에서 자주 볼 수 있는 이모티콘입니다.

 

 

 adress 필드에 문제의 이모지를 넣었습니다.

 

 

 다시 member 테이블에 들어있는 내용들을 출력해 보면, emoji가 정상적으로 들어갔음을 알 수 있습니다. 정리를 하면 mysql에서 utf8은, 가변 3byte까지밖에 넣지 못해요. 그러니, 캐릭터 셋이 utf8로 설정되었다면 이모지와 같은, 유니코드 값으로 U+FFFF가 넘어가는 문자에 대해서는 넣지 못할 겁니다.

 

 이들을 넣기 위해서는, 캐릭터 셋을 utf8mb4로 설정해 주어야 한다는 것만 아셔도 좋을 듯 싶습니다.