2016년 1월 12일 화요일

Upgrading from Previous to Current Unicode Support [from utf8 to utf8mb4]

이 부분은 이전 MySQL로부터 MySQL 5.7로 업그레이드할 때, unicode 지원과 관련된 이슈를 다룬다.
대부분의 방면에서, MySQL 5.7은 호환성의 잠재적인 부분이기는 하지만, Unicode 사용과 관련된 몇가지 문제점을 보여준다.
아래는 몇가지 먼저 생각해야할 부분이다.

- 변수 길이를 가지는 character data type (VARCHAR, TEXT)에 대하여서, utf8mb4의 최대 길이는 utf8 column의 길이보다 적다.
- 모든 character data type(CHAR, VARCHAR, TEXT)에 대하여, KEY값으로 indexing 될 수 있는 최대 글자 길이는 utf8보다 utf8mb4가 적다.

결과적으로, 만약 당신이 table을 utf8에서 utf8mb4로 업그레이드 한다면(추가적인 character 지원을 위해), 몇몇 column 혹은 index의 정의를 바꾸는 것은 필수적이다.

테이블은 AFTER TABLE 명령어를 통해 UTF8에서 UTF8MB4로 바뀔 수 있다. 기본적으로 아래와 같이 정의된 테이블을 보자.

CREATE TABLE t1 (
  col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) CHARACTER SET utf8;

아래 명령문은 t1을 utf8mb4를 사용하도록 바꾸는 것이다.

ALTER TABLE t1
  DEFAULT CHARACTER SET utf8mb4,
  MODIFY col1 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  MODIFY col2 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;

table 데이터의 방면에서 볼 때, utf8에서 utf8mb4로 바꾸는 것은 문제가 없다.

- BMP character에 대해서, utf8과 utf8mb4는 같은 storage 특성을 가진다. : 같은 code값, 같은 encoding, 같은 길이
- 보충되는 character에 대해서, utf8mb4가 저장하는 데에 4바이트를 요구하는 동안, utf8은 모든 character를 저장할 수 없다.
utf8은 보충되는 character를 저장할 수 없기 때문에, 당신은 utf8 column에서 어떠한 보충되는 character를 찾을 수 없고, 변환되는 문자나 데이타 손실을 걱정할 필요가 없다.

table 구조 측면에서, 중요한 점은 byte의 측면에서 column 혹은 index key의 최대 길이는 변하지 않는다는 것이다. 그래서,하나의 character가 3바이트에서 4바이트로 요구량이 바뀌면서,
character의 최대 길이는 줄어들게 된다. CHAR, VARCHAR, TEXT 데이터 타입에서, MySQL 테이블을 바꿀 때 아래 사항을 체크해야한다.

- 모든 utf8 칼럼의 정의를 체크하고, 그것들이 storage engine의 최대 값을 넘지않게 주의하라.
- 모든 utf9 칼럼의 index들을 체크하고 그것들이 storage engine의 최대 값을 넘지않게 주의하라. 가끔씩, storage engine 향상 때문에 최대 값이 바뀔 수 있다.

만약 이전의 상태를 적용한다면, 당신은 칼럼과 index의 길이를 줄이거나, utf8mb4 대신 utf8을 사용하여야 한다.

아래에 구조적 변화가 필요한 몇가지의 예가 있다.

- TINYTEXT는 최대 255 byte까지 가능하다. 이것은 3바이트에 85글자, 43바이트에 63글자를 의미한다. 만약 63글자를 넘기는 TINYTEXT 칼럼이 있다면 당신은 이것을 TEXT로 바꾸지않는한, utf8mb4로 바꿀 수 없다.
비슷하게, 매우 긴 VARCHAR 칼럼 또한, TEXT로 변환이 필요하다.

- InnoDB는 COMPACT나 REDUNDANT row 포맷을 사용할 때, 767 바이트의 테이블 index길이 제한을 가지고 있다. 이것은 utf8에서는 255글자, utf8mb4에서는 191글자이다.

COMPACT or REDUNDANT row formatInnoDB 테이블에서 아래 coloum과 index 정의는 허용된다.

col1 VARCHAR(500) CHARACTER SET utf8, INDEX (col1(255))

utf8mb4를 대신 사용할 때, index 값은 더 작아져야한다.

col1 VARCHAR(500) CHARACTER SET utf8mb4, INDEX (col1(191))

성능 부분에서 utf8mb4는 아래와 같다.

- utf8mb4는 utf8보다 느리다.

출처 : https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-upgrading.html

댓글 없음 :

댓글 쓰기