본문으로 바로가기

[Database][MySQL] Charset UT8 / UTF8MB4

category Back-end 2019.03.22 11:49
3. Charset
3.1 UTF8

- 모든 텍스트 데이터를 표현할 수 있는 자료형이다.
- UTF-8은 1~4 바이트까지 저장이 가능하게 설계 되어 있다.
- 전 세계 모든 언어가 21 Bit로 표현이 되어,
- MySQL은 3 Byte (정확히 21Bit) 가변 자료형으로 설계하였다. (성능과 공간 등에 이점)
 
3.2 UTF8MB4

- 가변 4바이트 UTF-8을 저장할 수 있는 자료형을
- 2010년 3월 24일 UTF8MB4 추가하였다.
- 원문 : The utfmb4 character set has been added. This is similar to utf8, but its encoding allows up to four bytes per character to enable supert for supplementary characters.
- utf8mb4가 추가되었습니다. 이것은 utf8과 비슷하지만 확장된 문자를 지원하기 위해 4바이트까지 저장할 수 있습니다.
- Emoji 문자열이 모두 4Byte로 표현된다.
- 스마트폰과 mac OSX에서 사용된다. (커멘드+컨트롤+스페이스)
- SMP(Supplementary Multilingual Plane - 옛 문자나 음악 기호, 수학 기호 등) 처리한다.


3.3 고려사항

- utf8는 utf8mb4의 서브셋이기때문에 인코딩 타입이 변경되었다고해서 해당 필드에 저장된 문자열이 깨지지 않는다.
- 문자 하나당 최대 bytes수가 바뀌면서 문자열 필드에 인덱스가 걸려있었다면 문제가 될 가능성이 있다.
- InnoDB 엔진의 경우 인덱스 할 수있는 최대 크기는 767 bytes 이다. 따라서 아래의 계산법에 따라 인덱스가 걸린 VARCHAR(255)인 필드가 있었다면 이 필드는 utf8mb4로 변경이 불가능하고 VAR(191)로 길이를 줄여줘야 인덱스를 유지한 상태로 utf8mb4로 변경이 가능하다.
VARCHAR(255)이 차지하는 최대 bytes 수
 - utf8인 경우 255 x 3 = 765 bytes (인덱스 가능)
 - utf8mb4인 경우 255 x 4 = 1020 bytes (인덱스 불가능!) VARCHAR(191)
 - utf8mb4인 경우 191 x 4 = 764 bytes (인덱스 가능)

3.4 Charset UTF8MB4 변경
  •  Charset 확인 쿼리
-- database 확인 
SELECT schema_name, default_character_set_name 
  FROM information_schema.SCHEMATA S WHERE schema_name = [scheme]

-- table 확인 
SELECT T.table_name, CCSA.character_set_name 
  FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA 
 WHERE CCSA.collation_name = T.table_collation AND T.table_schema = [scheme]
   AND T.table_name = [tableName]
;

-- column 확인 
SELECT table_name, column_name, character_set_name 
  FROM information_schema.`COLUMNS` C 
 WHERE table_schema = [scheme]
   AND table_name = [tableName]
   AND column_name = [columnName]
;

  • Alter Table 쿼리 추출
USE information_schema; 

SELECT concat('ALTER DATABASE ', table_schema, ' CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;') as _sql 
  FROM TABLES WHERE table_schema = [scheme] 
 GROUP BY table_schema

SELECT concat('ALTER TABLE ',table_schema, '.', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') as _sql 
  FROM `TABLES` WHERE table_schema = [scheme] 
 GROUP BY table_schema, table_name;

댓글을 달아 주세요

대마도사 블로그
블로그 이미지 대마도사 님의 블로그
MENU
VISITOR 오늘19 / 전체11,643