티스토리 뷰

반응형

의도나 생각 없이 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에 대해서 살짝 파보았다. 오늘은 여기까지!

참고 링크

 

Charset과 Collation에 대한 개념

출처: https://blog.lael.be/post/917 기술이 매우 빠르게 발전한다. 배워도 배워도 계속 배워야 한다. 최근에 라엘이가 앞으로 100년동안은 나타나지 않을 것이라고 예상했던, 4 Byte UTF-8 문자열을 보고

sshkim.tistory.com

 

MySQL UTF8MB4 Charset의 Collation 선택 (대소문자, 전각/반각, emoji 문자 구분)

MySQL에서 collation으로 인해 흔히 겪게 되는 문제는 알파벳 대소문자 구분 ...

blog.naver.com

 

 

전각 문자와 반각 문자 - 위키백과, 우리 모두의 백과사전

전각 문자와 반각 문자를 표시하는 한국어 명령 프롬프트 (cmd.exe). 전각 문자(全角文字)와 반각 문자(半角文字)는 주로 한중일의 인쇄 문화에서 사용하는 용어로, 문자의 폭이 일반적인 영문자의

ko.wikipedia.org

 

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
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
31
글 보관함