IT 관련/Database

[MySQL] utf8 vs utf8mb4 차이는?

nullzone 2017. 12. 31.
반응형


utf8 vs utf8mb4 차이는?


MySQL, MariaDB, Postgresql, MSSQL, Oracle등등의  Database를 사용하면서 혹은 개발언어등에서 CHARSET = utf8로 세팅하고 사용한다.

언제부턴가 나는 MySQL, MariaDB를 사용할 경우 자연스럽게 CHARSET를  utf8mb4로 사용한다.

몇 년전에 채팅 서버에 관심을 가지게 되었는데, 그러다 보니 메세지 사용중 emoji를 알게 되었고 자연스럽게 utf8mb4를 사용하게 되었다.

결론부터 말하면 MySQL, MariaDB는 utf8로 세팅하는 경우 emoji문자가 입력되지 않는다. 이런 문제점을 해결하기 위해 utf8mb4 라는 charset이 나오게 되었다. 


간단한, 예제를 실행해보면 알것이다.

예제 스크립에서 emoji 문자 😄를 입력하는 방법은 

  • Windows 8.1: 작업 표시줄의 빈 곳에서 마우스 오른쪽 클릭 → 도구 모음 → '터치 키보드' 왼쪽 클릭
  • Windows 10: 작업 표시줄의 빈 곳에서 마우스 오른쪽 클릭 → '터치 키보드 단추 보기' 왼쪽 클릭
  • Mac : CMD+Ctrl+Space 를 눌러서 입력한다.

utf8로 생성되는 table은 emoji문자가 등록되지 않고 에러가 나는데 반해서 utf8mb4로 생성된 테이블은 이상없이 처리 될것이다.

혹시라도 utf8mb4 로 테이블 생성이 되지 않는다면 MySQL, MariaDB의 버전이 낮아 uft8mb4를 지원하지 않는 것이다.

* utf8mb4는 MySQL, MariaDB에만 해당된다.



CREATE TABLE utf8_test(  
  `id` INT NOT NULL AUTO_INCREMENT,
  `test` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`id`)
) CHARSET=utf8 COLLATE=utf8_general_ci;

INSERT INTO utf8_test(test) VALUES('😄');
CREATE TABLE `Study_db`.`utf8mb4_test`(  
  `id` INT NOT NULL AUTO_INCREMENT,
  `test` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`id`)
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO utf8mb4_test(test) VALUES('😄');
SELECT * FROM utfmb4_test;


사실 별 문제가 안되어 보일수 있으나, 근래 스마트폰 사용이 주를 이루면서 게시판등에 emoji 사용이 지속적으로 늘어나는 점을 감안 한다면 utf8 보다는 utf8mb4를 사용하는게 맞지 않나 싶다.

* 클라이언트들은  utf8로 사용해도 큰 문제 없다.


언급한 김에  utf8 와 utf8mb4의 내부적인 차이를 보여주는 예제다.

아래 테이블 생성이 되지 않는다. 

에러 메세지를 보면 대충 짐작하겠지만,  utf8 는 가변3바이트를 사용하는데 반해서, utf8mb4는 내부적으로 한문자를 표현하는데 4바이트를 사용한다.

 


CREATE TABLE `Study_db`.`utf8mb4_key`(  
  `key_values` VARCHAR(255) NOT NULL,
  `test` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`key_values`)
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Error Code: 1709
Index column size too large. The maximum column size is 767 bytes.


따라서 위의 스크립트는 아래와 같이 키값의 크기를 줄여 주어야 한다.


CREATE TABLE `Study_db`.`utf8mb4_key`(  
  `key_values` VARCHAR(124) NOT NULL,
  `test` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`key_values`)
) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


위에서 언급한 utf8, utf8mb3에 관심을 가지게 만든  채팅서버는 Openfire 였다.

Openfire 서버를 설치 하는데 DB가 default로 Utf8mb4로 되어 있다보니 설치시에 에러가 났다.

채팅 서버라 하면 이런 부분도 신경을 써야 하지 않나...


키값의 길이를 줄이기 어렵다면

set global innodb_file_format=Barracuda;

로 innodb_file_format을 변경해도 된다. 









반응형

댓글