tomcat의 UTF-8 과 mysql의 utf8, utf8mb3, utf8mb4 의 차이는 뭘까

1. UTF-8 이란

linux server나 tomcat의 문자 인코딩 환경변수를 설정할 때 사용한다

UTF-8의 경우에는 4 bytes로 문자를 표현하는 문자 인코딩 방식이다.

UTF-8에서 한글은 ex) 초성(ㄸ), 중성(ㅗ), 종성(o) = 똥 을
각각 1바이트로 인식해서 일반적으로 한글을 3바이트로 인식하지만
공백이나 영문은 1바이트로 인식을 합니다.

UTF-8의 장점은 유니코드의 경우에는 다른 국가에서 한글 언어팩이 설치되지 않았다고 하더라도 한글 표현이 가능합니다.

Tomcat 환경에서 설정하는 UTF-8도 동일하다.
문자당 최대 4바이트를 사용하기 때문에
BMP 외부 문자(ex) Emoji 😀)를 포함한 모든 유니코드 문자를 처리할 수 있는 표준 문자 인코딩을 말한다.

BMP 란
기본 다국어 평면(Basic Multilingual Plane)은 유니코드에서
웬만한 문자 체계는 다 집어넣은, 언어학상으로 가장 중요한 영역으로,
U+0000 ~ U+FFFF까지의 코드가 부여된다.
이 안에 있는 문자 집합의 분류는 유니코드 문서에 있다.

2. utf8 이란

mysql DB에 character set 설정 변수이다.

mysql 에서 지원하는 3 byte 로 문자를 표현하는 문자 인코딩 방식이다.

예전에는 모든 전세계 모든 문자들이 3 bytes로 저장되었었다.

따라서 Mysql은 이러한 이유로 utf8을 3 bytes 기반의 자료형으로 설계하여 UTF-8을 지원하게 된다.

하지만 최근에는 4 bytes 문자열( ex) Emoji 😀)이 등장하면서
이러면 기존의 utf8로는 저장을 할 수 없게 되었다.

이러한 문제로 인해
Mysql 5.5.3 이후에 이 utf8mb4 코드를 추가해서 4bytes 기반의 문자열을 지원하기 시작했다.

3. utf8mb3 란

MySQL은 utf8mb3의 별칭으로 utf8을 사용해 왔습니다.

MySQL 8.0.28부터 utf8mb3는 이 문자 집합을 의미할 때 SHOW 문 및 정보 스키마 테이블의 출력에만 사용된다.

미래의 어느 시점에서 utf8은 utf8mb4에 대한 참조가 될 것으로 예상한다.

utf8의 의미에 대한 모호성을 방지하려면 문자 집합 참조에 utf8mb4를 utf8 대신 명시적으로 지정하는 것이 좋다.

또한 utf8mb3 문자 집합은 더 이상 사용되지 않으며 향후 Mysql 릴리스에서 제거될 것으로 예상된다.

대신 utf8mb4를 사용해라.

4. utfmb4 란

mysql DB에 character set 설정 변수이다.
(MariaDB 최근버전은 기본설정에서 따로 설정하지 않으면 default 값으로 utf8mb4를 사용한다)

Mysql 개발 초기에 utf8 문자 집합 구현은 문자당 최대 3바이트가 소요될 수 있는 가변 길이 인코딩을 사용했습니다.
그러나 이 구현에는 상당한 문제가 있어 혼란을 야기하였고 utf8mb4라는 새로운 문자 집합이 생성되었습니다.

Mysql의 원래 utf8 구현은 다양한 언어에서 사용되는 대부분의 일반 문자를 포함하는 BMP(기본 다국어 평면) 내의 문자만 처리할 수 있었고
특정 이모티콘이나 덜 일반적인 문자와 같은 BMP 외부의 문자는 지원하지 않았습니다.

이러한 제한을 해결하기 위해 MySQL은 버전 5.5.3에 utf8mb4를 도입했습니다.
utf8mb4 문자 집합은 문자당 4바이트가 필요한 고정 길이 인코딩을 사용하므로 BMP 외부 문자를 포함하여 유니코드 표준의 모든 문자를 처리할 수 있습니다.

utf8에서 utf8mb4로 변경된 것은 광범위한 문자를 지원해야 하는 애플리케이션과 데이터베이스, 특히 이모지 및 기타 특수 문자가 점점 더 많이 포함되는 국제화 및 현대적인 통신 환경에서 필요했습니다.
utf8mb4로 전환함으로써 MySQL은 유니코드 표준과 완전히 호환되며 원래 utf8 구현에 존재하는 제한을 해결했습니다.

5. 결론

  • UTF-8 = utf8mb4
  • utf8 = utf8mb3

UTF-8 (4 byte)은 mysql의 utf8 (3 byte) 과 다르다

6. 그 뒷이야기

만약 tomcat 설정은 UTF-8 을쓰고
mysql에서는 utf8 쓴다고 하면 문제는 없을까?

다음이야기 계속..

Leave a Comment