MYSQL 이나 MariaDB를 사용할 때 utf8mb4를 자주사용하게된다. 근데 varchar(2000)인 컬럼에 인덱스를 생성하려 했는데 3072byte를 넘어가면 저장할수 없다고 나오길래 800으로 줄여도 안되는것을 발견하게 되었다.
utf8에 경우 1~3바이트 가변길이로 문제없이 충분히 가능할것이라고 예상했지만, 전혀 다른 결과가 나왔다.
그래서 알아보게된 내용들
utf8mb4는 MySQL 5.3 버전 부터 추가되었으며, 이모지를 표기할 수 있게됨

이모지를 표현 하게 되면서 3byte로는 부족하기에 utf8mb4는 1~4byte 가변 길이 이다. 그래서 위에 인덱스를 생성할 때 4* 800 > 3072 이기에 생성이 불가능했던 것이다.
charset이 다양하게 있는데, ascii(1byte), latin1 (2byte), utf8(1~3 가변 byte), utf8mb4(1~4 가변 byte)가 있다. (더 있지만 생략) 만약 영문과 숫자로만 이루어진 데이터를 저장할 때 DB 사용량을 조금 줄이고 싶다면 ascii 을 사용하면 좋을 것 같다. ex) UUID
더 찾아보니 collation 이란 것도 있다..
특정 무낮 셋에 의해 데이터베이스에 저장된 값들을 비교 검색하거나 정렬 등의 작업을 위해 문자들을 서로 비교 할때 사용하는 규칙들의 집합이다.
대부분 collation 기본 세팅을 utf8_general_ci를 사용하게 된다.
우선 각 charset에 따라 사용가능한 collation이 달라지는 데 지금은 utf8만 알아보자
utf8_bin
바이너리 저장값 그대로 정렬한다
hex 코드로 A는 41, B는 42 , a는 61 등 그렇기에 a,b,A,B를 조회한다고 치면 A , B, a ,b 순으로 출력된다.
utf_general_ci
텍스트를 정렬할 때 a 다음에 b가 나타나야 한다는 생가으로 나온 정렬방식. 라틴 계열 문자를 사람의 인식에 맞게 정렬한다.
utf8_unicode_ci
general_ci 보다 조금 더 사람에 맞게 정렬한다.
한국어, 영어, 중국어 등 사용환경에서는 general_ci와 unicode_ci의 결과가 동일하다.