2025 11 12
2025-11-12¶
Unicode¶
- 유니코드
- 전 세계 문자의 ID 매핑 테이블
- 코드 포인트
- 문자에 부여된 고유한 ID 번호
- 형식:
U+뒤 16진수 숫자를 붙이기- 예:
A=U+0041,가=U+AC00
- 예:
- 그냥 숫자일뿐, 컴퓨터에 저장되는 바이트 값은 아님
- 인코딩
- 코드 포인트를 컴퓨터가 이해하는 바이트로 변환
- 같은
가(U+AC00)라도 UTF-8/UTF-16에 따라 바이트 값이 달라짐
- 유니코드 구조
- 0번~16번까지 총 17개의 평면으로 나뉨
- BMP (Basic Multilingual Plane)
U+0000~U+FFFF- 한글/영어/한자 등 자주쓰는 대부분의 문자
- SMP (Supplementary Multilingual Plane)
- 이모지, 고대문자 등
- 데이터베이스나 문자열 길이 체크에서 문제가 발생할 수 있음
- ex. MySQL utf8/utf8mb4
- utf8mb4를 써야 이모지를 저장할 수 있음
- ex. MySQL utf8/utf8mb4
- 인코딩 방식 비교
UTF-8- 가변길이(1~4 byte)
- 영어: 1byte
- 한글: 3byte
- ASCII 호환 O (ASCII 파일이 곧 UTF-8)
- 주 사용처: web, network, file system, database
- 웹 표준, 소스코드, linux, REST API
- `UTF-16
- 가변길이(2 or 4 byte)
- 영어: 2byte
- 한글: 2byte
- ASCII 호환 X
- 주 사용처: In-Memory (OS, 런타임)
- JVM, JavaScript Engine 등에서 문자열 처리를 UTF-16으로 함
- 정규화(Normalization)
- 유니코드는 한글을 표현하는 두가지 방법을 허용
- NFC(조합형): 윈도우, 리눅스, 웹 표준 -> 자소 합쳐 하나의 코드 포인트로 저장 (
가:U+AC00) - NFD(분해형): macOS 파일 시스템 -> 자소 풀어서 저장 (
ㄱ+ㅏ:U+1100+U+1161)
- NFC(조합형): 윈도우, 리눅스, 웹 표준 -> 자소 합쳐 하나의 코드 포인트로 저장 (
- 유니코드는 한글을 표현하는 두가지 방법을 허용
MySQL 인코딩¶
- MySQL 8.0 기준 인코딩
utf8mb4: 기본 인코딩으로, 전 세계 모든 문자 및 이모지 저장 가능utf8mb3: 사용 금지, 이모지 저장 불가latin1: 서유럽 언어 전용
- Collation
- 비교/정렬 규칙
- 인코딩으로 저장만 한다면,
A(0x41)/a(0X61) 비교했을 때 소문자가 더 큼 - collation을 설정하여 우리가 원하는대로 소문자가 앞에 오도록 논리적 비교 정의 가능
- 인코딩으로 저장만 한다면,
utf8mb4_0900_ai_ci: 유니코드 9.0 기반, 악센트/대소문자 구분 X, 정확도 높음- ai(accent insensitive): 악센트 구분 여부.
ai: e == é(같다고 취급) - ci(case insensitive): 대소문자 구분 여부.
ci: A == a(같다고 취급 -> 일반적인 검색 요구사항)
- ai(accent insensitive): 악센트 구분 여부.
utf8mb4_general_ci: 속도를 위해 단순화한 정렬, 성능 차이 미미해서 잘 안씀
- 비교/정렬 규칙