utf-8 과 utf8mb4 에 대해서 알아보자.


해당 캐릭터셋은 현재 회사 DB가 euckr 인데...이것을 utf8로 변경하고자 확인하던 도중 많은 도움이 된 블로그가 있어서 정리하면서 같이 소개해 본다.


아래 블로그의 모든 내용을 조금씩 정리하면서 작성하였습니다.

가져온 블로그 : https://blog.lael.be/post/917




utf-8 문자 집한은 1~4 byte까지 저장이 가능하게 설계(가변 바이트)


 -> 다국어가 지원이 되기 때문에 전세계 모든 언어를 저장이 가능하다

 -> MySQL에서 utf8 을 3 Byte 가변 자료형으로 설계


하지만 최근에 나온 4 byte 문자열(Emoji 같은 것)을 utf8 에 저장하면 값이 손실되는 현상이 발생

(charset 은 utf8 / collation 는 utf8_general_ci)


4 Byte UTF-8 문자열

 : MySQL에서 기존 설계대로 가변 4 Byte utf-8 문자열을 저장할 수 있는 자료형을 추가

 -> 이것이 utf8mb4 로 지정 (MySQL 5.5.3 에서부터 추가)


- utf8 : Basic Plane.


- utf8mb4 : Basic Plane + Supplementary Plane.


추가로 utf8mb4 는 Emoji 문자열 지원

 

- 스마트폰에서 지원하는 문자들을 지원 (SMP - Supplementary Multilingual Plane)

  (모바일 어플의 경우의 DB는 utf8mb4 로 설정하는 것이 좋을 듯 싶다) 

 아래 이미지 참고 





즉, utf8 (가변 3바이트) utf8mb4 (가변 4바이트) 저장공간의 크기




Collaction


Collaction은 텍스트 데이터를 정렬 (Order by) 할 때 사용

text 계열 자료형에서만 사용할 수 있는 속성


utf8_bin (utf8mb4_bin)


Binary 저장 값 그대로 정렬

Hex 코드 (16진수)로 되어 있기에 해당 값으로 정렬


utf8_uniconde_ci (utf8mb4_unicode_ci)


한국어, 영어, 중국어, 일본어 사용환경에서는 general_ci 와 unicode_ci 의 결과가 동일

하지만 외국어 및 특수문자가 들어가는 경우 다름




utf8mb4 charset 에, utf8mb4_unicode_ci collation 사용 하는 것이 좋을 듯 싶다.


문제점


1) 다국어를 처리할 수 있는 UTF-8 이라는 저장방식이 있음. 원래 설계는 가변4바이트임.


2) 전세계 모든 언어문자를 다 카운트 해봤는데 3 바이트가 안됨.


3) MYSQL/MariaDB 에서는 공간절약+속도향상 을 위해서 utf8 을 가변3바이트로 설계함.


4) Emoji 같은 새로나온 문자가 UTF-8의 남은 영역을 사용하려함 (4바이트 영역).


5) MYSQL/MariaDB 에서 가변4바이트 자료형인 utf8mb4 를 추가함.  (2010년 3월에).



반응형

매일 하나씩 공유하고 연구하자는게 하루만에 무너졌다....

다시 시작해보자!!!




mysqlbinlog 관련하여 테스트 중 binlog_format 을 row로 변경하여 테스트 하던 도중 아래와 같은 에러가 발생 하였다.


ERROR: Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 47, event_type: 19



으음.....여기저기 찾아봤는데 원하는 답변을 못 찾았다...

그러다 어느 중국 사이트에서 유사 관련하여 올려 놓은 것을 확인할 수 있었다.


단순 default 로 잡힌 mysqlbinlog 의 version을 확인해 보자



3.2 인것을 확인할 수 있다.

버전차이 때문에 발생할 수 있으니 다음과 같이 엔진에 있는 mysqlbinlog 로 확인해 보자




3.4 인 것을 확인할 수 있다.


그렇다면 다시 binlog가 제대로 되는지 확인해 보자



제대로 import되는 것을 확인할 수 있다.


row 관련한 내용은 좀 더 공부해야겠다...참고로 아래 이미지를 보면 정말 oracle 의 rowid 를 보는 듯한 느낌이 난다...



반응형
최근에 너무 바빴다..
아픈것도 있었고...심신의 위로가 너무나도 필요했다.

의욕도 생기지 않은것도 한몫 했다...

이런 하소연은 Life에 일기로 써야지....ㅋㅋ쓰다보면 위로가 될꺼라 믿고...


각설하고 오늘부터 하루에 기술 관련 정리하여 올리자고 한다.

작심 3일을 매주 2번..씩 다짐한다.




오늘 Binlog_format에 대한 정리한 것을 공유해 본다.


아래 블로그에서 참고 하였다.

[출처] : http://mysqldba.tistory.com/196



★ binlog_format 종류 및 차이

  • Statement Format : 가장 오래된 Format으로 데이터 변경에서 사용되는 모든 쿼리를 쿼리대로 저장하는 방식을 말함(5.7까지 기본 Format)
  • Row Format : 변경 작업으로 변경된 모든 Row의 정보를 기록하는 방식
  • Mixed Format : Statement 방식과 Row 방식을 혼합한 방식으로 기본은 Statement 방식이고, 몇몇의 경우에는 Row방식으로 동작하는 방식
mysql> set global binlog_format = 'STATEMENT';
mysql> set global binlog_format = 'ROW';
mysql> set global binlog_format = 'MIXED';

 - global 대신 session 으로 변경 가능

* Row 와 Statement 

데이터베이스에 작은 변경을 많이 발생 시키는 쓰레드는 열 기반 로깅을 선호한다. 
WHERE 구문에 있는 많은 열과 매치가 되는 업데이트를 실행하는 쓰레드는 명령문 기반 로깅을 선호하는데, 그 이유는 많은 열을 로깅하는 것 보다는 적은 명령문 로깅이 효과적이기 때문이다.

마스터에서 오랜 실행 시간 동안 실행되지만 비교적 적은 수의 열만을 수정하는 명령문들이 있다. 
이러한 명령문들은 열 기반 로깅을 사용해서 복제하는 것이 보다 효과적이다.


* Defualt 


* STATEMENT 일때 로그 흔적


* row 형태의 format




* Format 변경 시 문제 발생하는 시점
    • Trigger나 Stored Function을 사용하고 있는 경우
    • NDB Cluster Storage Engine을 사용하고 있는 경우
    • 현재 Temporary Table을 사용하고 있는 세션이 있는 경우

  • Mixed Binary Logging Format 을 사용하면 Binary log를 작성하면 MySQL은 자동적으로 Statement방식과 Row 방식을 섞어서 기술
    • Row 방식으로 작성 되는 경우
      • NDB Cluster Table에 DML이 실행된 경우
      • UUID()를 사용한 경우
      • Auto_Increment 칼럼을 가지고 있는 테이블에 연결된 Trigger나 Stored Function이 생성되어 사용되는 경우
      • Insert Delayed가 실행하는 경우
      • User Defined Function 을 호출할 때 등
  • Storage Engine 별로 지원하는 format

Storage Engine

Row Logging Supported

Statement Logging Supported

Archive

Yes

Yes

Blackhole

Yes

Yes

CSV

Yes

Yes

Example

Yes

No

Federated

Yes

Yes

Heap

Yes

Yes

InnoDB

Yes

Yes / When the Transaction isolation level is Repeatable Read or Serializable : No otherwise.

MyISAM

Yes

Yes

Merge

Yes

Yes

NDB

Yes

No


  • Storage Engine별 지원하는 logging 형태에 따라 2가지로 분류
    1. SLC (Statement-Logging Capable) - Statement Logging 방식을 지원하는 Storage Engine.
    2. RLC (Row-Logging Capable) - Row Logging 방식을 지원하는 Storage Engine
  • Binary Log에 작성되는 3가지 종류
    1. Safe : Statement 방식으로 작성 시 Replication 이나 복구 시에 문제가 되지 않는 쿼리 형태
    2. UnSafe : Statement 방식으로 작성 시 Replication 이나 복구 시에 문제가 되는 쿼리 형태
    3. Row/Binary Injection : Row Event로 Row Based 방식으로 실행하기 위해 저장되는 Event형태 (Row format 으로 로깅해야 지만, 변경 내역이 저장되는 것을 의미)
  •  MySQL은 Grant 작업은 직접적인 DML로 진행될 수도 있으나 간접적인 DDL 구문으로 실행 가능
    1. 직접적으로 실행되는 DML 는 Binlog_format에 따라 작성되는 방법이 다름 (Insert / Update / Delete / Replace / Do / Load Data Infile / Select / Truncate table)
    2. 간접적으로 실행되는 DDL 문은 Binlog_format과 상관없이 무조건 Statement방식으로 저장(Grant / Revoke / Set Password / Rename User / Create / Alter Drop)
    3. Create table .. Select 경우 Create Table 은 Statement 방식으로 저장되고 Select 부분은 Binlog_format 설정값에 따라 달라짐


반응형

+ Recent posts