티스토리 뷰
의도나 생각 없이 mysql collation을 general_ci을 쓰거나 unicode_ci를 쓰곤 했다. 이번에 unicode_ci로 통일하게 되었는데, collation 때문에 의도치 않은 상황을 겪었다. 그래서 collation에 대해서 살짝 파보았다.
Character Set
Character Set은 문자를 어떻게 표현할 지 정의한 집합이다. 세상에 존재하는 많은 문자들을 디지털로 표현하기 위해서 정의했다고 볼 수 있다. 이 시대에 우리가 주로하는 utf-8이 바로 Character Set 이다. utf-8은 세상의 대부분의 문자와 특수기호, 심지어 이모지를 1~4바이트로 표현할 수 있게 정의해두었다.
mysql에서는 utf8을 3바이트로 표현하는 선택을 했다. (세상의 모든 언어가 21bit로 저장할 수 있기 때문이라나..) 그래서 최근에 나온 이모지(😀😁 등등)는 4바이트인데 이걸 제대로 저장하지 못한다. 그래서 MySql은 2010년에 utf8mb4라는 4바이트까지 저장가능한 Character Set을 만들었다. 그래서 이모지를 자주 다는 댓글이나 채팅 서비스를 MySql을 이용해서 구현할때는 utf8mb4로 Character Set을 설정해야한다.
다른 Charater Set도 있을 텐데, 쓸일이 없어서 파보지 않았다.
Collation
collation은 text 자료형에서 문자열들을 비교 정렬하는 방식을 나타낸다. 어떤게 더 먼저나와야할 지, 어떤게 같은 건지 정의했다. 내가 알아야하는 것으로 unicode, general 방식이 있고, 그 뒤에 붙어서 대소문자를 구분하는 것을 의미하는 ci(case insensitive)가 있다.
Character Set과 Collation을 합쳐서 보통 utf8mb4_unicode_ci 이렇게 쓸 수 있다. 문자열 집합과 정렬기준을 설정할 수 있다.
골때리는 것은 이 Collation에 따라서 MySql이 임의로 특정 문자열을 같은 것으로 취급하는 것이다. 특히 unicode는 사람이 같다고 판단하는 것을 같은 것으로 취급한다. 아래의 예시에서 그것을 확인해볼 수 있다.
-- 1(FULLWIDTH DIGIT ONE, %EF%BC%91) vs 1 (DIGIT ONE, %31)
select '1' = '1' collate utf8mb4_unicode_ci;
select '1' = '1' collate utf8mb4_general_ci;
-- SPACE (%20) vs IDEOGRAPHIC SPACE(%E3%80%80)
select ' ' = ' ' collate utf8mb4_unicode_ci;
select ' ' = ' ' collate utf8mb4_general_ci;
첫번째 unicode collation을 사용하는 sql을 실행해보면 결과가 1(true)로 같다고 나온다. 전각(Full Width) 문자와 반각(Half Width) 문자를 같게 다루는 것이다.
만약 (사람이 봤을 때) 생긴건 같아도 다르게 취급하고 싶다면, utf8mb4_bin을 사용하면 된다.
정리
상황에 맞는 도구를 선택하고, 문제 상황에 대응할 수 있도록 Character Set과 Collation에 대해서 살짝 파보았다. 오늘은 여기까지!
참고 링크
'ETC' 카테고리의 다른 글
같은 한글이 아니라고? 유니코드 완성형과 조합형의 차이! (0) | 2021.05.16 |
---|---|
2019년 새해 목표 (0) | 2019.01.15 |
거북이의 기적 스터디 카페 후기 (0) | 2018.10.25 |
tistory markdown으로 작성하기 및 코드 syntax highlighting하기 (0) | 2016.10.19 |
Kotlin 발표자료 (0) | 2016.05.30 |
- Total
- Today
- Yesterday
- container
- html
- Clean code
- sanur
- 컨테이너
- Docker
- 객체지향
- S68
- ChatGPT
- 독후감
- AWS
- hands-on
- 개발자
- rest
- Bali
- javascript
- 웹
- AWSKRUG
- 한달살기
- ES6
- 도커
- 회고
- ecma6
- 사누르
- spring
- 실수노트
- spring boot
- springboot
- 웹을 지탱하는 기술
- 발리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |