본문 바로가기
허브 살리기 프로젝트

MySQL UTF8MB4

by jay-choe 2024. 2. 19.

 

MySQL을 사용하다보면 드는 의문이 있었는데

 

왜 UTF8이랑 UTF8MB4의 인코딩 타입이 나눠져 있는지다.

 

특수 문자를 지원하기 위해 인코딩 타입을 UTF8MB4로 변경하고 Collation 까지 변경해주어야 하는 작업을 하다보니 왜 디폴트 값이 UTF8MB4가 아니고 UTF8이 왜 특수문자를 지원을 안 하는지 기존 UTF-8 인코딩 방식이 이모지를 포함하는 걸로 알고 있는데 혼란이 온다.

 

그래서 하나씩 개념을 정리해가면서 원일을 찾아가보려고 한다.

 

 

유니코드

유니코드는 전 세계의 문자 체계를 컴퓨터에서 일관되게 표현하려는 표준이다.

 

예를 들어서 'A'를 어떤 분야에서 65로 표현하는 것과 다른 분야에서는 700이라고 표현하는 것 즉 일관성이 없는 부분은 분명 혼란스러울 것이다. 

 

그래서 'A'는 65 만 사용합시다! 라고 표준화 한 것이 유니코드라고 볼 수 있다.

 

인코딩 타입

그럼 표준화 된 데이터를 어떻게 전달 할 수 있을지에 관해서 생각을 해 보면

 

전 세계의 문자들이 10만개 가량이고 계속 추가가 되는 상황이라고 생각을 해보면

 

간단하게 생각을 해 봐도 2바이트만 써도 될 것 같다.

(그냥 단순하게 문자를 나타내는 경우의 수만 봤을 때)

 

그렇다면 여기서 고민 할 것은 항상 전 세계의 문자들을 다 표현 할 필요가 있는가? 이다.

 

특정 환경에서는 특수 문자만 사용하는 서비스도 있을 것인데 즉 1바이트만 써도 충분한 서비스에서 2바이트씩 데이터를 전달하면서 1바이트를 버리는 것은 불필요하게 데이터 전송량만 2배로 늘리는 것 아닌가.

 

그래서 우리는 문자열들을 특정한 녀석들만 사용하겠습니다!  하고 정의 할 수 있는 것이 인코딩 타입이라고 할 수 있다.

 

인코딩 타입 종류

개발 환경에서 접하게 될 수 있는 것 위주로 간단히 정리해보려고 한다.

 

 

  • EUC-KR
    • 문자를 컴퓨터에서 인코딩하기 위해 사용되는 문자 인코딩 방식중 하나
    • EUC-KR은 한글과 한자 등을 포함하여 대략 8,000여 개의 문자를 인코딩할 수 있다.
    • 현재는 UTF-8이 웹과 다양한 시스템에서 국제적인 표준으로 자리잡으면서, EUC-KR 사용은 점차 감소
  • UTF-8
    • 각 문자를 1바이트에서 최대 4바이트까지 인코딩하는 방식 (가변 길이)
    • 전 세계의 모든 문자를 하나의 통합된 인코딩 방식으로 지원
    • 다국어 환경에서의 개발과 통신에 더욱 적합하다.
  • UTF-16
    • 내용은 UTF-8과 같음 
    • 문자를 2바이트 또는 4바이트로 인코딩하는 방식
  • UTF-32
    • 가변 길이 인코딩 방식을 사용하지 않고 모든 문자를 4바이트로 인코딩 하는 방식

 

한 눈에 봐도 다국어 지원을 하면서 가장 효율적인 인코딩 방식은 UTF-8이다. 

 

1바이트만 필요한 문자는 1바이트만 사용하고 2바이트만 필요한 문자는 2바이트만 사용한다면 효율적일 것이다.

그래서 해당 인코딩 방식이 표준이 된 것 같다.

 

그럼 어떻게 문자열이 1바이트만 쓸건지 4바이트만 쓸건지를 판단 할 수 있을까?

 

간단하게 정리해보면 바이트마다 형식을 다르게 하여 구분 할 수 있다.

  • 1바이트 문자: 첫 바이트가 0xxxxxxx 형식(x는 0 또는 1)
  • 2바이트 문자: 첫 바이트가 110xxxxx 형식, 후속 바이트가 10xxxxxx 형식
  • 3바이트 문자: 첫 바이트가 1110xxxx 형식, 후속 바이트들이 10xxxxxx 형식
  • 4바이트 문자: 첫 바이트가 11110xxx 형식, 후속 바이트들이 10xxxxxx 형식

 

즉 인코딩 된 문자를 해석 할 때는 첫 바이트를 보고 해당 문자의 사이즈를 확인하고 해당 바이트 만큼 인코딩 하는 방식이다.

 

 

MySQL에서 utf8mb4

근데 MySQL에서는 utf8과 utf8mb4가 있는데 무슨 차이일까? 새로운 인코딩 방식일까?

 

공식문서에 utf8은 utf8mb3를 지칭한다고 되어있으며 UTF-8의 3Byte 인코딩 방식이다.

 

utf8mb3, utf8mb4의 차이는 결론부터 말하면

인코딩 가변길이의 제한이다. 즉 3은 3바이트이고 4는 4바이트까지 사용한다는 것이다.

 

예전에 설계 당시에는 이모지 같은 4바이트까지 사용해야하는 일이 거의 없었기 때문에 해당 방식으로 설계됐지만

(단순 인코딩을 떠나서 정렬 기준 같은 것들을 보면 이전 시기에는 utf8mb4를 사용하는 것은 과한 것으로 보인다.)

 

시간이 지나면서 많은 변화가 생겨서 utf8mb4를 만들어서 지원하는 것으로 보인다.

 

 

위의 공식 문서에도 나와있듯 버전이 업그레이드 되면서 utf8(utf8mb3) 방식은 제거가 될 예정이다.

 

참고

https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html

 

'허브 살리기 프로젝트' 카테고리의 다른 글

Server Side Rendering  (0) 2024.03.03
Image Resizing  (0) 2024.02.26
DB가 내부 망에 존재하는 이유  (1) 2024.02.17
CPU Pinning  (0) 2024.02.14
Connection Timeout Monitoring in Connection Pool  (1) 2024.02.11