피드로 돌아가기
Migrating a Magento 2 store from utf8 to utf8mb4 without losing data
Dev.toDev.to
Database

MySQL utf8mb3의 3바이트 한계 극복을 위한 utf8mb4 전면 전환 및 Index 최적화

Migrating a Magento 2 store from utf8 to utf8mb4 without losing data

Robin Dhiman2026년 6월 22일4intermediate

Context

MySQL의 utf8(utf8mb3)이 최대 3바이트만 지원함에 따라 4바이트 문자인 Emoji 및 CJK 확장 문자가 저장될 때 데이터가 silent truncation 되는 결함 발생. Strict mode 미설정 시 에러 없이 데이터가 유실되는 치명적인 데이터 무결성 문제 직면.

Technical Solution

  • CONVERT TO CHARACTER SET utf8mb4를 통한 기존 테이블 데이터의 물리적 재작성 및 인코딩 변환 수행
  • Index 길이 제한(767 bytes) 해결을 위해 MySQL 5.7 innodb_large_prefix 활성화 또는 8.0 DYNAMIC Row Format 적용으로 한도를 3072 bytes로 확장
  • 767 bytes 제한 환경의 레거시 서버 대응을 위해 Indexed VARCHAR 컬럼 길이를 191자로 축소하여 4바이트 기준 최대 길이(191x4=764) 확보
  • my.cnf 설정 변경 및 Application Connection Charset 동기화를 통한 End-to-End utf8mb4 통신 경로 구축
  • 대용량 테이블의 Lock 시간 최소화를 위해 pt-online-schema-change 또는 gh-ost 기반의 Online Schema Change 전략 채택
  • Join 쿼리 시 발생하는 Illegal mix of collations 방지를 위해 전 스키마에 utf8mb4_unicode_ci 단일 Collation 적용

- MySQL

5.7 이하 사용 시 Row Format이 DYNAMIC 또는 COMPRESSED인지 확인 - 단순 테이블 변환 외에 Server Default 및 Application Connection 설정 동기화 여부 검증 - Indexed Column의 최대 길이를 191자로 제한하여 인덱스 생성 오류 사전 방지 - 서비스 중단 최소화를 위해 Online Schema Change 도구 도입 검토 - 모든 테이블의 Collation을 동일한 값으로 통일하여 Join 시의 런타임 에러 방지

원문 읽기