티스토리 뷰
Author: 니용
업무 시간에 데이터 입력 중 일부가 입력이 되지 않아 데이터를 확인해보니 내용에 이모지가 포함되어 있었습니다. 이전에 얘기가 나왔었던 Character Set의 문제로 인코딩이 제대로 되지 않았습니다.
기존에는 UTF-8의 한글 포맷을 그대로 따라가고 있었고 캐릭터셋은 'utf8_general_ci'를 사용하였습니다.
결론부터 말씀드리면 이를 'utf8mb4_unicode_ci' 로 변경하면 됩니다.
그럼 유니코드와 UTF-8에서 쓰는 UTF는 무슨 차이가 있는 것일까요?
정의를 먼저 보자면 유니코드는 이와 같습니다.
유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이며, 유니코드 협회(Unicode Consortium)가 제정한다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자들을 다루기 위한 알고리즘 등을 포함하고 있다.
유니코드의 목적은 현존하는 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다. 기존의 인코딩들은 그 규모나 범위 면에서 한정되어 있고, 다국어 환경에서는 서로 호환되지 않는 문제점이 있었다. 유니코드가 다양한 문자 집합들을 통합하는 데 성공하면서 유니코드는 컴퓨터 소프트웨어의 국제화와 지역화에 널리 사용되게 되었으며, 비교적 최근의 기술인 XML, 자바, 그리고 최신 운영 체제 등에서도 지원하고 있다.
유니코드에서 한국어 발음을 나타날 때는 예일 로마자 표기법의 변형인 ISO/TR 11941을 사용하고 있다.
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
다음으로 UTF-8을 찾아봅시다.
UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 켄 톰프슨과 롭 파이크가 만들었다. UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit 의 약자이다. 본래는 FSS-UTF(File System Safe UCS/Unicode Transformation Format)라는 이름으로 제안되었다.
UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다. UTF-16과 UTF-8 중 어느 인코딩이 더 적은 바이트를 사용하는지는 문자열에서 사용된 코드 포인트에 따라 달라지며, 실제로 DEFLATE와 같은 일반적인 압축 알고리즘을 사용할 경우 이 차이는 무시할 수 있을 정도이다. 이러한 압축 알고리즘을 사용하기 힘들고 크기가 중요할 경우 유니코드 표준 압축 방식(Standard Compression Scheme for Unicode)을 대신 사용할 수 있다.
https://ko.wikipedia.org/wiki/UTF-8
이 말인 즉슨, UTF-8이 유니코드 내에 포함되어 있다고 봐도 무방하겠네요. 즉 Unicode > UTF-8이라는 의미겠지요?
지금 사용하고 있는 이모지의 대부분은 미국 회사에서 만들어진 문자 표들의 방식을 따르고 있습니다. 또, 새로운 이모지가 많이 나왔는데 기존에 문자 표에는 등록이 안 돼있는 경우도 정말 많죠. 그렇기 때문에 UTF-8로 저장을 하게 된다면 문자 표에 등록이 되어 있지 않은 문자열들이 나오기 때문에 문자들을 저장하여도 제대로 저장이 안 되는 경우가 많죠.
한글만 저장하는 테이블이라면 'utf8_general_ci' 캐릭터 조합을 사용하여도 상관없지만, 이모지가 하나라도 들어가게 된다면 가급적으로 'utf8mb4_unicode_ci' 를 사용하는 것이 좋습니다.
(utf8은 가변 3바이트를 사용하지만, mb4의 의미는 한 문자당 4바이트 문자열을 사용한다는 의미입니다)
MySQL의 기준으로 ALTER Query는 아래와 같습니다.
ALTER TABLE `TABLE_NAME` CHANGE COLUMN `COL1` `COL1` VARCHAR(50) NULL DEFAULT NULL COMMENT '컬럼 1의 내용' COLLATE 'utf8mb4_unicode_ci', CHANGE COLUMN `COL2` `COL2` VARCHAR(100) NULL DEFAULT NULL COMMENT '컬럼 2의 내용' COLLATE 'utf8mb4_unicode_ci' AFTER `COL1`, CHANGE COLUMN `COL3` `COL3` VARCHAR(100) NULL DEFAULT NULL COMMENT '컬럼 3의 내용' COLLATE 'utf8mb4_unicode_ci' AFTER `COL2`; |
* 혹여나 ALTER 문이 적용되지 않는다면, MySQL의 버전이 낮아서 발생할 수도 있는 문제이니 최신 버전 업그레이드를 하신 후 진행하시면 좋습니다.
'Server' 카테고리의 다른 글
Kotlin 변수의 Wrapper Type (0) | 2020.06.25 |
---|---|
Kotlin 설치법 (0) | 2020.06.24 |
Kotlin이 뭐에요? (1) | 2020.06.22 |
MySQL Function 만들기 (1) | 2020.06.12 |
MySQL 의 LEFT OUTER JOIN - 23년 7월 수정 (0) | 2020.06.11 |
로그 명령어와 grep 옵션 (0) | 2020.05.26 |