티스토리 뷰
업무 중에 character set utf8mb4 collate utf8mb4_general_ci 로 선언된 컬럼을 발견했다.
utf8mb4를 쓰면 이모지를 지원한다는 것 밖에 몰랐기 때문에 이참에 한번 찾아봤다.
문자 집합 (Character Set)
문자 집합(Character Set)은 문자열에서 사용하는 문자의 집합이다. 예를 들어 a-z까지의 알파벳이 있고 각 알파벳마다 숫자를 a=1, b=2, c=3,…로 연결한다고 가정해보자. 문자 a는 심볼이고 그 a와 연결된 숫자 1은 a의 인코딩(=부호화, 코드화)이다. 이 a부터 z까지의 조합과 코드를 문자 집합(Character Set)이라고 한다.
주요 문자 집합
SHOW CHARACTER SET; 명령어로 MySQL에서 지원하는 문자 집합을 조회할 수 있다.
- 한글 기반 : EUC-KR, utf8mb4, MS949(윈도우), CP949(유닉스 계열. MySQL에선 미지원)
- 일본어 : cp932, utf8mb4
💡 utf8은 utf8mb4의 부분 집합으로, MySQL 서버에서 utf8mb4가 도입되기 이전에 주로 사용됐다. utf8은 한 글자를 저장하기 위해 1~3바이트까지를 사용하지만 이모지 등 4바이트를 사용하는 글자가 등장함에 따라 이를 저장할 수 있도록 4바이트까지 사용하는 utf8mb4가 생겼다.
문자 집합 설정하기
문자 집합은 문자열을 저장하는 CHAR, VARCHAR, TEXT 타입의 컬럼에만 설정할 수 있다.
[컬럼에 문자 집합 설정 적용 사례]
CREATE TABLE `comment` (
`id` bigint not null auto_increment,
`user_id` bigint not null,
`context` varchar(255) null character set utf8mb4 # 특정 컬럼에 문자집합 적용
);
MySQL에서 최종적으로는 컬럼 단위로 문자 집합을 관리하지만 편의를 위해 MySQL 서버와 DB, 그리고 테이블 단위로 기본 문자 집합을 설정할 수 있는 기능을 제공한다. 즉 테이블의 문자 집합을 UTF-8로 설정하면 칼럼의 문자 집합 집합을 별도로 지정하지 않아도 해당 테이블에 속한 컬럼은 UTF-8 문자 집합을 사용한다. 물론 테이블의 기본 문자 집합이 UTF-8이라고 하더라도 각 컬럼에 대해 문자 집합을 EUC-KR이나 ASCII 등으로 별도 지정할 수도 있다.
[테이블에 문자 집합 적용 사례]
CREATE TABLE `comment` (
`id` bigint not null auto_increment,
`user_id` bigint not null,
`context` varchar(255) null
)ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 # 테이블에 문자 집합 적용
콜레이션(Collation)
콜레이션은 문자열 컬럼의 값에 대한 비교나 정렬 순서를 위한 규칙을 의미한다. 즉, 비교나 정렬 작업에서 영문 대소문자를 같은 것으로 처리할지, 아니면 더 크거나 작은 것을 판단할지에 대한 규칙을 정의하는 것이다. 각 문자열 컬럼의 값을 비교하거나 정렬할 때는 항상 문자 집합뿐 아니라 콜레이션의 일치 여부에 따라 결과가 달라지며, 쿼리의 성능 또한 상당한 영향을 받는다.
🔠 Collate : 1.대조하다 2.맞추어 보다 3.비교하다
MySQL의 모든 문자열 타입의 컬럼은 독자적인 문자 집합과 콜레이션을 가진다. 각 컬럼에 대해 독립적으로 문자 집합과 콜레이션을 지정하지 않으면 MySQL 서버나 DB의 기본 문자 집합과 콜레이션이 자동으로 설정된다.
[Database에 기본 설정된 문자 집합과 콜레이션 확인하는 법]
select @@character_set_database, @@collation_database;
SHOW COLLATION; 명령어로 MySQL에서 지원하는 콜레이션을 확인할 수 있다.
문자 집합과 콜레이션과의 관계
문자 집합은 2개 이상의 콜레이션을 가지고 있으며, 하나의 문자 집합에 속한 콜레이션은 다른 문자 집합과 공유해서 사용할 수 없다. 문자 집합만 지정 시 해당 문자 집합의 디폴트 콜레이션이 적용되고, 반대로 콜레이션만 지정한 경우 묵시적으로 해당 콜레이션이 속한 문자 집합으로 사용된다.
콜레이션 이름의 의미
3개 파트로 구성된 이름
- 문자 집합의 이름
- 해당 문자 집합의 하위분류
- 대소문자 구분 여부
- ci (Case Insensitive) : 대소문자 구분 X
- cs (Case Sensitive) : 대소문자 구분
2개 파트로 구성된 이름
- 문자 집합 이름
- 항상 bin(=binary, 이진 데이터) 키워드 사용.
- 이진 데이터로 관리되는 문자열 컬럼은 별도의 콜레이션을 가지지 않는다.
- 비교 및 정렬은 실제 문자 데이터의 바이트 값을 기준으로 수행된다.
참고자료
https://www.mysqltutorial.org/mysql-character-set/
'Database' 카테고리의 다른 글
[인덱스] B-Tree vs Hash, InnoDB vs MyISAM (0) | 2022.11.06 |
---|---|
[MySQL] 정합성과 잠금, 트랜잭션, 격리 수준 간단 정리 (0) | 2022.09.26 |
[MySQL] CHAR & VARCHAR (0) | 2022.09.08 |
대규모 데이터를 다루기 위한 기초지식 - 국소성, 파티셔닝 (0) | 2022.08.19 |
[책] 업무에 바로 쓰는 SQL튜닝 (0) | 2022.01.31 |
- Total
- Today
- Yesterday
- 주니어개발자
- k8s
- 리눅스 컨테이너
- 몽고디비
- java
- 쿠버네티스
- MySQL
- springboot
- devops
- docker
- laravel
- mockery
- 도커
- 라라벨
- 백엔드
- index
- redis
- pods
- php
- 분산처리
- 샤드
- 샤딩
- laravel 테스트코드
- NoSQL
- database
- mongoDB
- phpUnit
- kubernetes
- laravel 테스트
- 대규모 데이터 처리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |