MySQL Character Set, Collation - 2

jin·2023년 10월 4일

이전 글 : https://velog.io/@haegu/MySQL-CharacterSet-Collation

이전 글에서 MySQL Character Set, Collation이 왜 중요한지, 그리고 이번 설명을 위해 필요한 배경지식 (Unicode, 인코딩, 디코딩) 과 용어들을 살펴보았다.

이번 글에서는 MySQL Character Set과 Collation에 대해 본격적으로 정리해보고자 한다.

Character Set ? Collation ?

우선 두 용어에 대해 설명하고자 한다.

Character Set

Character Setsymbols과 encodings의 집합을 의미한다.
CollationCharacter Set 안의 각각의 Character 들을 서로 비교하는 규칙의 집합을 의미한다.

캐릭터 셋과 콜레이션을 전혀 모르는 사람이 이 설명을 보면, 당연히 와닿지 않을 것이다. 뒤로가기를 누르지 않기 바라며, 예시와 비유를 통해 쉽게 접근해보자.

예를 들어, a, b, A, B 라는 4개의 문자가 있다.
그리고 각 문자를 A = 1, B = 2, a = 3, b = 4 라고 하자.

A = 1에서, A는 symbol, 1은 encoding이 된다.
앞서 Character Set은 symbols와 encodings의 집합 이라고 했으므로, 4가지 symbol(a, b, A, B)과 각 encoding(1, 2, 3, 4)을 합치면 캐릭터 셋이 된다.

즉, (A = 1, B = 2, a = 3, b = 4) 처럼 각 symbol과 encoding 규칙을 정해놓은 것이 캐릭터 셋이다.

이전 글에서 설명했던 Unicode 의 개념과 매우 유사하다.

Collation

Collation은, 쉽게 말해 캐릭터 셋 내의 각 문자를 비교할 때 사용할 규칙이다.

앞선 예시(A = 1, B = 2, a = 3, b = 4)에서, A와 a 중 더 큰 값이 무엇일까?

누군가는 A가 크다고 생각할 수도 있고, 누군가는 a가 크다고 생각할 수도 있다. 또는 둘의 대소를 비교하는 것 자체가 뭔가 찜찜한 사람도 있을 것이다.

답이 깔끔하게 정해지지 않는 이유는 A와 a를 비교하는 규칙을 정하지 않은 상태로 두 문자의 대소에 대해 물었기 때문일 것이다.

이러한 비교를 하는 주체가 사람이 아니라 컴퓨터 연산이라면, 더욱 확실하게 비교 방법을 정해주어야 할 것이다.

그래서 필요한 것이 바로 Collation 이다.

예를 들어, "encoding 값을 비교하여 대소를 결정한다"는 규칙을 이용해 A와 a를 비교한다면 A의 encoding 값인 1과 a의 encoding 값인 3를 서로 비교하여 "a가 더 크다 !"고 말할 수 있을 것이다.

Collation을 보다 정확하게 표현하면, 비교를 위한 규칙의 집합이다. 즉, Collation 내의 한가지 이상의 규칙을 사용할 수도 있을 것이다.

위 예시처럼 'encoding 값을 비교하여 대소를 결정'하면, 이는 1가지 규칙을 사용한 Collation이 된다.

사용자의 니즈에 따라서 "encoding 값을 비교하여 대소를 결정한다" 와 더불어 "대소문자는 구분하지 않는다" 는 규칙을 추가 할 수 있고, 이 때는 이 두 가지 규칙을 합친 set가 Collation이 되는 것이다.

이 설명에는 MySQL 도큐먼트 내용과 예시를 활용하였다.
필요하다면 다음 링크를 추가로 참조하기 바란다.
https://dev.mysql.com/doc/refman/8.0/en/charset-general.html

Collation을 규칙의 집합이라고 표현하여 걱정되는 것은, 원하는 Collation을 여러가지 선택하여 사용하는 것처럼 이해할 수 있다는 점이다.

동시에 여러가지 Collation에 영향을 받는 것은 아니며, 하나의 Collation 안에 여러가지 규칙이 포함되어 있는 것이다.

실제 MySQL 내에서 선택할 수 있는 Collation 예시를 하나 보자.
복잡하게 생겼지만, 그리 어렵지 않다.

예시 Collation Name : utf8mb4_0900_ai_ci

  • utf8mb4
    • 함께 사용되는 Character Set Name
    • Character Set에 따라 사용할 수 있는 Collation 목록이 정해진다.
  • 0900
    • Unicode 의 collation algorithm 9.0.0 을 지원 (가장 최신의 유니코드 표준)
  • ai
    • accent insensitivity의 약자이다.
    • 예를 들어 (e, è, é, ê and ë)를 같은 문자로 취급한다.
  • ci
    • case insensitivity의 약자이다.
    • 예를 들어 p 와 P 를 같은 순서로 취급한다.

utf8mb4_0900_ai_ci이라는 Collation 내에 ai, ci 같은 여러 규칙이 포함되어 있는 것이다.

Collation Name을 통해 어떤 캐릭터 셋에 대한 콜레이션인지, 어떤 언어에 특화된 콜레이션인지, accent나 case에 sensitivity 한지 등과 같은 정보를 표기하고 있다.

0개의 댓글