MySQL 문자 집합 변경 가이드: utf8mb4로 변환 (문자 깨짐 해결)

目次

1. 소개

MySQL 문자 집합을 변경해야 할 수 있는 이유

데이터베이스 문자 집합은 텍스트 데이터가 어떻게 인코딩되고 저장을 위해 처리되는지를 결정하는 중요한 설정입니다. MySQL에서는 기본 문자 집합이 보통 latin1이며, 이는 일본어 등 특수 문자를 사용할 때 문제를 일으킬 수 있습니다. 특히 데이터 마이그레이션이나 시스템 표준화 과정에서는 적절한 문자 집합으로 전환하는 것이 필수적입니다.

일반적인 문제와 원인

MySQL 문자 집합과 관련된 전형적인 문제는 다음과 같습니다.

  1. 모지베케(깨진 문자)
  • 동일 환경에서 utf8latin1이 혼합됨
  • 클라이언트와 서버의 문자 집합 설정이 일치하지 않음
  1. 검색 시 문제
  • 정렬 규칙 차이로 기대한 검색 결과가 반환되지 않음
  • 정렬 순서가 기대와 다름
  1. 데이터 마이그레이션 중 문제
  • utf8mb4를 사용하지 않아 이모지 및 특수 기호를 저장할 수 없음
  • 내보내기/가져오기 시 문자 집합 변환이 제대로 처리되지 않음

문서 목표 및 구성

이 문서는 MySQL 문자 집합 변경에 대해 기본 개념부터 설정 변경 방법문제 해결까지 포괄적으로 설명합니다.

개요

  1. MySQL 문자 집합에 대한 기본 지식
  2. 현재 문자 집합 확인 방법
  3. MySQL 문자 집합 변경 방법
  4. 변경 후 문제 해결
  5. 문자 집합 변경이 성능에 미치는 영향
  6. 권장 설정(모범 사례)
  7. FAQ(자주 묻는 질문)

이 가이드를 읽으면 MySQL 문자 집합에 대한 이해가 깊어지고 올바른 설정을 선택해 일반적인 문제를 피할 수 있게 됩니다.

2. MySQL 문자 집합이란? 기본 개념 이해

문자 집합이란?

문자 집합(Character Set)은 문자를 디지털 데이터로 저장하고 처리하기 위해 사용되는 규칙들의 집합입니다. 예를 들어 일본어 문자 “あ”를 저장할 때 UTF-8은 바이트 시퀀스 E3 81 82로 표현하고, Shift_JIS82 A0을 사용합니다.

MySQL에서는 데이터베이스 수준이나 테이블 수준에서 서로 다른 문자 집합을 지정할 수 있습니다. 적절한 문자 집합을 선택하면 모지베케를 방지하고 국제화가 원활해집니다.

일반적인 문자 집합

Character SetCharacteristicsUse Case
utf8UTF-8 up to 3 bytesDoes not support some special characters (such as emoji)
utf8mb4UTF-8 up to 4 bytesSupports emoji and special characters (recommended)
latin1ASCII-compatibleUsed in older systems

정렬 규칙이란?

정렬 규칙(Collation) 은 문자 집합 내에서 데이터를 비교하고 정렬하는 규칙 집합입니다. 예를 들어 “A”와 “a”를 동일 문자로 취급할지, 정렬 순서는 어떻게 결정할지를 정의합니다.

일반적으로 사용되는 정렬 규칙

CollationDescription
utf8_general_ciCase-insensitive, suitable for general use
utf8_unicode_ciUnicode-based collation (recommended)
utf8mb4_binBinary comparison (use when exact matches are required)

utf8utf8mb4의 차이점

MySQL의 utf8은 실제로 문자당 최대 3바이트만 저장할 수 있어 이모지나 일부 확장 CJK 문자와 같은 특수 문자를 처리하지 못합니다. 반면 utf8mb4는 문자당 최대 4바이트를 지원하므로 최신 애플리케이션에서는 utf8mb4 사용이 권장됩니다.

Character SetMax BytesEmoji SupportRecommendation
utf83 bytes❌ Not supported❌ Not recommended
utf8mb44 bytes✅ Supported✅ Recommended

utf8에서 utf8mb4로 전환해야 하는 이유

  1. 미래 호환성 : 최신 시스템은 utf8mb4를 표준화하고 있음.
  2. 특수 문자 및 이모지 저장 : utf8mb4를 사용하면 SNS 게시물 및 메신저 앱의 데이터를 안전하게 처리 가능.
  3. 국제화 : 다국어 시스템에서 모지베케 위험을 감소시킴.

요약

  • 문자 집합은 데이터가 저장되고 처리되는 방식을 결정합니다.
  • 정렬 규칙은 문자 비교 방식을 결정합니다.
  • MySQL의 utf8은 3바이트로 제한되므로 utf8mb4를 권장합니다.
  • utf8mb4_unicode_ci는 일반적으로 권장되는 정렬 규칙입니다.

3. 현재 문자 집합 확인 방법

MySQL 문자 집합을 변경하기 전에 현재 설정을 확인하는 것이 중요합니다.
문자 집합은 데이터베이스, 테이블, 컬럼 등 여러 레벨에서 설정될 수 있으므로, 정확히 어느 부분을 변경해야 하는지 파악해야 합니다.

현재 문자 집합 확인 방법

MySQL 서버 전체 문자 집합 확인

먼저, 전체 MySQL 서버의 기본 문자 집합 및 정렬 설정을 확인하십시오.

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

예시 출력:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                        |
+--------------------------+----------------------------+

데이터베이스별 문자 집합 확인

특정 데이터베이스의 문자 집합을 확인하려면 다음 쿼리를 사용하십시오.

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';

예시 출력

+----------------+----------------------+----------------------+
| SCHEMA_NAME    | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------+----------------------+----------------------+
| my_database   | utf8mb4               | utf8mb4_unicode_ci   |
+----------------+----------------------+----------------------+

테이블의 문자 집합 확인

특정 테이블의 문자 집합을 확인하는 방법은 다음과 같습니다.

SHOW CREATE TABLE table_name;

예시 출력

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;

점검 포인트

  • DEFAULT CHARSET=latin1utf8mb4가 아니므로 변경이 필요합니다
  • COLLATE=latin1_swedish_ci → 일반적으로 utf8mb4_unicode_ci로 전환하는 것이 더 적절합니다

컬럼의 문자 집합 확인

컬럼 수준에서 문자 집합을 확인하려면 다음 SQL을 실행하십시오.

SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'database_name' 
AND TABLE_NAME = 'table_name';

예시 출력

+-------------+--------------------+----------------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME       |
+-------------+--------------------+----------------------+
| name        | latin1             | latin1_swedish_ci    |
| email       | utf8mb4            | utf8mb4_unicode_ci   |
+-------------+--------------------+----------------------+

이 예시에서 name 컬럼은 latin1을 사용하고 있으므로 utf8mb4로 변경하는 것이 권장됩니다.

요약

  • MySQL 문자 집합은 여러 수준(서버, 데이터베이스, 테이블, 컬럼)에서 설정됩니다.
  • 각 수준에서 문자 집합을 확인함으로써 적절한 변경을 적용할 수 있습니다.
  • SHOW VARIABLESSHOW CREATE TABLE과 같은 명령을 사용하여 현재 설정을 완전히 파악하십시오.

4. MySQL 문자 집합 변경 방법

MySQL 문자 집합을 적절히 변경하면 문자 깨짐을 방지하고 다국어 데이터를 보다 원활하게 지원할 수 있습니다.
이 섹션에서는 각 수준별(서버 전체, 데이터베이스, 테이블, 컬럼) 설정 업데이트 방법을 설명합니다.

서버 전체 기본 문자 집합 변경

서버 전체 기본 문자 집합을 변경하려면 MySQL 설정 파일(my.cnf 또는 my.ini)을 편집해야 합니다.

단계

  1. 설정 파일 열기
  • Linux: bash sudo nano /etc/mysql/my.cnf
  • Windows: wp:list /wp:list

    • C:\ProgramData\MySQL\MySQL Server X.X\my.ini 열기
  1. 문자 집합 설정 추가 또는 변경 mysqld 섹션 아래에 다음 줄을 추가하거나 업데이트하십시오.
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
  1. MySQL 재시작
    sudo systemctl restart mysql
    

Windows에서:

net stop MySQL && net start MySQL
  1. 변경 확인
    SHOW VARIABLES LIKE 'character_set_server';
    

데이터베이스 수준에서 문자 집합 변경

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

변경 확인

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME 
FROM information_schema.SCHEMATA 
WHERE SCHEMA_NAME = 'mydatabase';

테이블 수준에서 문자 집합 변경

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

변경 확인

SHOW CREATE TABLE users;

컬럼 수준에서 문자 집합 변경

ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

변경 확인

SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'mydatabase' 
AND TABLE_NAME = 'users';

변경 후 검증 및 백업의 중요성

문자 집합을 변경한 후 데이터 무결성을 유지하려면 다음 단계를 따르세요.

데이터 백업

mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql

설정 재확인

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE TABLE users;

테스트 데이터 삽입 및 표시

INSERT INTO users (name, email) VALUES ('Test User', 'test@example.com');
SELECT * FROM users;

요약

  • 서버 전체 문자 집합 변경 : my.cnf 파일을 편집하고 character-set-server=utf8mb4 로 설정
  • 데이터베이스 문자 집합 변경 : ALTER DATABASE mydatabase CHARACTER SET utf8mb4
  • 테이블 문자 집합 변경 : ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4
  • 컬럼 문자 집합 변경 : ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4
  • 변경 후에는 항상 설정을 확인하고 데이터를 테스트하세요

5. 문자 집합 변경 후 문제 해결

MySQL 문자 집합을 변경한 후 시스템이 올바르게 동작하지 않거나 저장된 데이터가 깨지는 경우가 발생할 수 있습니다. 이 섹션에서는 일반적인 문제와 해결 방법을 자세히 설명합니다.

모지베이크(문자 깨짐)의 원인 및 해결 방법

문자 집합을 변경한 후 모지베이크가 발생한다면, 다음과 같은 원인이 일반적입니다.

CauseHow to CheckSolution
The client character set setting differsSHOW VARIABLES LIKE 'character_set_client';Run SET NAMES utf8mb4;
Existing data was stored using a different encodingSELECT HEX(column_name) FROM table_name;Use CONVERT() or re-export the data
The connection encoding is not correctConnect with mysql --default-character-set=utf8mb4Adjust the client-side character set configuration
Application settings (PHP/Python, etc.) are incorrectmysqli_set_charset($conn, 'utf8mb4');Standardize the application’s character set settings

해결책 #1: 클라이언트 문자 집합을 올바르게 설정

SET NAMES utf8mb4;

해결책 #2: 기존 데이터를 올바르게 변환

UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);

latin1에서 utf8mb4로 변환할 때 주의사항

안전한 절차

  1. 현재 데이터 백업
    mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
    
  1. 데이터베이스 문자 집합 변경
    ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. 테이블 문자 집합 변경
    ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. 데이터 재수입
    mysql -u root -p --default-character-set=utf8mb4 mydatabase < backup.sql
    

변경 후 데이터 검색이 안 됨

사례 #1: LIKE 검색이 작동하지 않음

SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci LIKE '%Tanaka%';

사례 #2: 정렬 순서가 변경됨

SELECT * FROM users ORDER BY BINARY name;

애플리케이션 측 조치

PHP용

mysqli_set_charset($conn, 'utf8mb4');

Python (MySQL Connector)용

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="mydatabase",
    charset="utf8mb4"
)

For Node.js (MySQL2)

const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'mydatabase',
  charset: 'utf8mb4'
});

Summary

  • Post-change issues generally fall into three categories: client settings, data conversion, and application settings.
  • To prevent mojibake, standardize the client character set using SET NAMES utf8mb4.
  • Watch for LIKE search and sort order changes, and specify COLLATE when needed.
  • Set utf8mb4 in your application as well to avoid encoding mismatches.

6. How Character Set Changes Affect Performance

When changing the MySQL character set to utf8mb4, there are several performance considerations, such as increased storage usage and index limitations.
In this section, we explain the impact and the best countermeasures.

Increased Storage Usage

Compared to MySQL’s utf8, utf8mb4 can use up to 4 bytes per character,
so the overall table size may increase.

Max bytes per character by character set

Character SetMax Bytes per Character
latin11 byte
utf83 bytes
utf8mb44 bytes

For example, with utf8, VARCHAR(255) is up to 765 bytes (255×3),
but with utf8mb4, it becomes up to 1020 bytes (255×4).

Countermeasure

ALTER TABLE posts MODIFY COLUMN title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Increased Index Size

MySQL enforces a maximum index key length.
After switching to utf8mb4, index entries become larger, and you may hit the limit—making indexes unusable.

Check index impact

SHOW INDEX FROM users;

Example error

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

Countermeasure

ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Impact on Query Performance

Changing the character set to utf8mb4 may affect query execution speed.

Operations that may be affected

  • LIKE searches over large datasets
  • ORDER BY processing
  • JOIN query performance

Countermeasure

CREATE INDEX idx_name ON users(name(100));

Memory Usage and Buffer Tuning

With utf8mb4, memory usage may increase.

Recommended settings

[mysqld]
innodb_buffer_pool_size = 1G
query_cache_size = 128M

Summary

  • Switching to utf8mb4 increases storage usage.
  • Index sizes increase and may exceed limits.
  • Query performance can be affected.
  • Because memory usage may increase, buffer sizes may need tuning.

7. Recommended Settings (Best Practices)

By setting MySQL character sets appropriately, you can maintain data integrity while optimizing performance.
In this section, we present recommended MySQL character set configurations and explain key points for an optimal setup.

Recommended MySQL Character Set Configuration

ItemRecommended SettingReason
Character Setutf8mb4Supports all Unicode characters including emoji and special characters
Collationutf8mb4_unicode_ciCase-insensitive and suitable for multilingual systems
Storage EngineInnoDBGood balance of performance and consistency
Indexed string lengthVARCHAR(191)Avoids exceeding MySQL index limits

Recommended my.cnf Settings

1. MySQL Server Character Set Settings

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
skip-character-set-client-handshake
innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
query_cache_size = 128M

2. Client-Side Character Set Settings

[client]
default-character-set = utf8mb4

Recommended Database Settings

CREATE DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

To change an existing database character set:

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Recommended Table Settings

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

기존 테이블의 문자 집합 변경

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

utf8mb4_general_ciutf8mb4_unicode_ci의 차이점

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, more accurate comparisonsGeneral-purpose use (recommended)

다국어 지원이나 정확한 정렬이 필요하다면 utf8mb4_unicode_ci를 선택하세요.

인덱스 최적화

CREATE FULLTEXT INDEX idx_fulltext ON articles(content);

요약

  • utf8mb4 + utf8mb4_unicode_ci 조합을 권장합니다.
  • 서버 설정(my.cnf)과 연결 문자 집합을 표준화합니다.
  • 데이터베이스, 테이블, 컬럼 수준에서 utf8mb4를 명시적으로 지정합니다.
  • VARCHAR(191)를 사용하여 인덱스 키 길이 제한을 피합니다.
  • 정확한 비교를 위해 utf8mb4_unicode_ci를 사용합니다.

8. FAQ

MySQL 문자 집합 변경에 대한 일반적인 실제 질문들을 모았습니다.
또한 오류 처리 방법최적 설정 선택 방법을 다룹니다.

utf8utf8mb4의 차이점은 무엇인가요?

SHOW VARIABLES LIKE 'character_set_server';

MySQL 문자 집합을 변경하면 데이터 손실이 발생할까요?

mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql

문자가 깨졌을 경우 어떻게 해결할 수 있나요?

UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);

latin1에서 utf8mb4로 변환할 때 위험 요소는 무엇인가요?

ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

utf8mb4로 전환하면 성능에 영향을 미치나요?

ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

utf8mb4_general_ci 또는 utf8mb4_unicode_ci 중 어느 것을 사용해야 할까요?

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, accurate comparisonsGeneral-purpose use (recommended)

utf8mb4로 전환한 후 쿼리가 느려질까요?

CREATE FULLTEXT INDEX idx_fulltext ON articles(content);

요약

utf8mb4를 권장합니다. 제한 사항 때문에 utf8은 권장되지 않습니다.
변경하기 전에 항상 SHOW VARIABLES로 설정을 확인하세요.
문자 깨짐을 방지하기 위해 export/import 워크플로를 사용하세요.
인덱스 제한을 고려하고 적절히 VARCHAR(191)를 사용하세요.
성능을 위해 적절한 인덱스를 추가하세요.

최종 참고 사항

MySQL 문자 집합을 변경하는 것은 단순한 설정 조정이 아니라 데이터 무결성과 성능에 영향을 줄 수 있는 중요한 작업입니다.
올바른 설정과 절차를 따르면 utf8mb4로 안전하고 효과적으로 마이그레이션할 수 있습니다.

🔹 이 문서의 단계에 따라 문자 집합을 올바르게 구성하세요! 🔹