콘텐츠로 이동

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를 써야 이모지를 저장할 수 있음
  • 인코딩 방식 비교
    • 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)
    • 유니코드는 한글을 표현하는 두가지 방법을 허용
      1. NFC(조합형): 윈도우, 리눅스, 웹 표준 -> 자소 합쳐 하나의 코드 포인트로 저장 (: U+AC00)
      2. NFD(분해형): macOS 파일 시스템 -> 자소 풀어서 저장 (+: U+1100+U+1161)

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 (같다고 취급 -> 일반적인 검색 요구사항)
    • utf8mb4_general_ci: 속도를 위해 단순화한 정렬, 성능 차이 미미해서 잘 안씀
  • collation에 ci가 박혀있으면 결과가 똑같이 나와

    SELECT * FROM receipt_user where account = 'joel.jo1@test.kakao.com';
    SELECT * FROM receipt_user where account = 'Joel.jo1@test.Kakao.com';
    

    • Collation 때문에 결과는 같아도, account에 인덱스 없으면 풀스캔 탐 (당연한 얘기)