MySQL String Data Types (binary vs non-binary)

jin·2023년 10월 5일

이번 글에서는 String Data Types에 대해, 특히 Binary String Data Type과 Non-Binary String Data Type에 대해 정리하고자 한다.

각 진영의 타입들이 가진 속성과 차이점을 가볍게 살펴볼 것이다.

Binary String Types

Binary 속성을 가진 스트링 데이터 타입들은 다음과 같다.

  • BINARY
  • VARBINARY
  • BLOB

Non-Binary String Types

Non-Binary 속성을 가진 스트링 데이터 타입들은 다음과 같다.

  • CHAR
  • VARCHAR
  • TEXT

이제 비교해보자.

Binary 속성을 가진 스트링 타입들은, byte strings을 저장한다.
Non-Binary 속성의 스트링 타입들은, character strings을 저장한다.

그래서,
Binary 속성의 스트링 타입들은 binary character set과 binary collation에 영향을 받는다.
따라서 저장할 문자열의 바이트(숫자 값)을 통해 비교 연산과 정렬을 하게된다.

.. 갑작스럽고 와닿지 않는 설명일 것이라고 생각한다.

Non-Binary 속성의 스트링 데이터 타입은, 사용자의 니즈에 따라서 a와 A를 같은 값으로 취급할 수 있다.

이 때 영향을 미치는 것이 Character Set과 Collation이고, Non-Binary 속성의 데이터 타입에서 a와 A의 연관성(대소문자라는 관계)을 이용할 수 있도록 설계되었음을 알 수 있다.

그런데, Binary 속성의 스트링 타입은 a와 A의 연관성, 즉 둘이 대소문자 관계라는 점을 전혀 고려하지 않는다.

단순히 a = 1, A = 2 라고 가정 했을 때, 1과 2는 다르기 때문에 a != A라고 판단하는 방식을 사용한다.

즉, 첫 번째 차이점을 다시 말하자면 다음과 같다.

  • Binary 속성 스트링 타입은 항상 바이트 값을 이용해 비교 및 정렬한다.
  • Non-Binary 속성 스트링 타입은 비교 방식을 선택할 수 있다.
    • 예를 들어 대소문자 구별 여부, 악센트 구별 여부, 바이너리 방식과 똑같이 동작할지 여부 등을 선택할 수 있다.

또 하나의 주요한 차이점은 허용하는 길이를 다루는 방식이다.

테이블 선언 시 VARCHAR(20), CHAR(20)과 같이 선언하면, 이 컬럼에는 최대 20개의 문자를 저장할 수 있다.

VARBINARY(20), BINARY(20)과 같이 선언하면, 이 컬럼에는 최대 20개의 문자가 아니라 최대 20개의 바이트를 저장할 수 있다.

즉, Non-Binary 속성의 스트링 타입에서는 최대 문자 개수를 선언한다.
그에 비에 Binary 속성의 스트링 타입에서는 최대 바이트 수를 선언한다.

0개의 댓글