- 1 1. 소개
- 2 2. MySQL 문자 집합이란? 기본 개념 이해
- 3 3. 현재 문자 집합 확인 방법
- 4 4. MySQL 문자 집합 변경 방법
- 5 5. 문자 집합 변경 후 문제 해결
- 6 6. How Character Set Changes Affect Performance
- 7 7. Recommended Settings (Best Practices)
- 8 8. FAQ
1. 소개
MySQL 문자 집합을 변경해야 할 수 있는 이유
데이터베이스 문자 집합은 텍스트 데이터가 어떻게 인코딩되고 저장을 위해 처리되는지를 결정하는 중요한 설정입니다. MySQL에서는 기본 문자 집합이 보통 latin1이며, 이는 일본어 등 특수 문자를 사용할 때 문제를 일으킬 수 있습니다. 특히 데이터 마이그레이션이나 시스템 표준화 과정에서는 적절한 문자 집합으로 전환하는 것이 필수적입니다.
일반적인 문제와 원인
MySQL 문자 집합과 관련된 전형적인 문제는 다음과 같습니다.
- 모지베케(깨진 문자)
- 동일 환경에서
utf8과latin1이 혼합됨 - 클라이언트와 서버의 문자 집합 설정이 일치하지 않음
- 검색 시 문제
- 정렬 규칙 차이로 기대한 검색 결과가 반환되지 않음
- 정렬 순서가 기대와 다름
- 데이터 마이그레이션 중 문제
utf8mb4를 사용하지 않아 이모지 및 특수 기호를 저장할 수 없음- 내보내기/가져오기 시 문자 집합 변환이 제대로 처리되지 않음
문서 목표 및 구성
이 문서는 MySQL 문자 집합 변경에 대해 기본 개념부터 설정 변경 방법 및 문제 해결까지 포괄적으로 설명합니다.
개요
- MySQL 문자 집합에 대한 기본 지식
- 현재 문자 집합 확인 방법
- MySQL 문자 집합 변경 방법
- 변경 후 문제 해결
- 문자 집합 변경이 성능에 미치는 영향
- 권장 설정(모범 사례)
- FAQ(자주 묻는 질문)
이 가이드를 읽으면 MySQL 문자 집합에 대한 이해가 깊어지고 올바른 설정을 선택해 일반적인 문제를 피할 수 있게 됩니다.
2. MySQL 문자 집합이란? 기본 개념 이해
문자 집합이란?
문자 집합(Character Set)은 문자를 디지털 데이터로 저장하고 처리하기 위해 사용되는 규칙들의 집합입니다. 예를 들어 일본어 문자 “あ”를 저장할 때 UTF-8은 바이트 시퀀스 E3 81 82로 표현하고, Shift_JIS는 82 A0을 사용합니다.
MySQL에서는 데이터베이스 수준이나 테이블 수준에서 서로 다른 문자 집합을 지정할 수 있습니다. 적절한 문자 집합을 선택하면 모지베케를 방지하고 국제화가 원활해집니다.
일반적인 문자 집합
| Character Set | Characteristics | Use Case |
|---|---|---|
utf8 | UTF-8 up to 3 bytes | Does not support some special characters (such as emoji) |
utf8mb4 | UTF-8 up to 4 bytes | Supports emoji and special characters (recommended) |
latin1 | ASCII-compatible | Used in older systems |
정렬 규칙이란?
정렬 규칙(Collation) 은 문자 집합 내에서 데이터를 비교하고 정렬하는 규칙 집합입니다. 예를 들어 “A”와 “a”를 동일 문자로 취급할지, 정렬 순서는 어떻게 결정할지를 정의합니다.
일반적으로 사용되는 정렬 규칙
| Collation | Description |
|---|---|
utf8_general_ci | Case-insensitive, suitable for general use |
utf8_unicode_ci | Unicode-based collation (recommended) |
utf8mb4_bin | Binary comparison (use when exact matches are required) |
utf8과 utf8mb4의 차이점
MySQL의 utf8은 실제로 문자당 최대 3바이트만 저장할 수 있어 이모지나 일부 확장 CJK 문자와 같은 특수 문자를 처리하지 못합니다. 반면 utf8mb4는 문자당 최대 4바이트를 지원하므로 최신 애플리케이션에서는 utf8mb4 사용이 권장됩니다.
| Character Set | Max Bytes | Emoji Support | Recommendation |
|---|---|---|---|
utf8 | 3 bytes | ❌ Not supported | ❌ Not recommended |
utf8mb4 | 4 bytes | ✅ Supported | ✅ Recommended |
utf8에서 utf8mb4로 전환해야 하는 이유
- 미래 호환성 : 최신 시스템은
utf8mb4를 표준화하고 있음. - 특수 문자 및 이모지 저장 :
utf8mb4를 사용하면 SNS 게시물 및 메신저 앱의 데이터를 안전하게 처리 가능. - 국제화 : 다국어 시스템에서 모지베케 위험을 감소시킴.
요약
- 문자 집합은 데이터가 저장되고 처리되는 방식을 결정합니다.
- 정렬 규칙은 문자 비교 방식을 결정합니다.
- 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=latin1→utf8mb4가 아니므로 변경이 필요합니다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 VARIABLES및SHOW CREATE TABLE과 같은 명령을 사용하여 현재 설정을 완전히 파악하십시오.

4. MySQL 문자 집합 변경 방법
MySQL 문자 집합을 적절히 변경하면 문자 깨짐을 방지하고 다국어 데이터를 보다 원활하게 지원할 수 있습니다.
이 섹션에서는 각 수준별(서버 전체, 데이터베이스, 테이블, 컬럼) 설정 업데이트 방법을 설명합니다.
서버 전체 기본 문자 집합 변경
서버 전체 기본 문자 집합을 변경하려면 MySQL 설정 파일(my.cnf 또는 my.ini)을 편집해야 합니다.
단계
- 설정 파일 열기
- Linux:
bash sudo nano /etc/mysql/my.cnf Windows: wp:list /wp:list
C:\ProgramData\MySQL\MySQL Server X.X\my.ini열기
- 문자 집합 설정 추가 또는 변경
mysqld섹션 아래에 다음 줄을 추가하거나 업데이트하십시오.[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
- MySQL 재시작
sudo systemctl restart mysql
Windows에서:
net stop MySQL && net start MySQL
- 변경 확인
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 문자 집합을 변경한 후 시스템이 올바르게 동작하지 않거나 저장된 데이터가 깨지는 경우가 발생할 수 있습니다. 이 섹션에서는 일반적인 문제와 해결 방법을 자세히 설명합니다.
모지베이크(문자 깨짐)의 원인 및 해결 방법
문자 집합을 변경한 후 모지베이크가 발생한다면, 다음과 같은 원인이 일반적입니다.
| Cause | How to Check | Solution |
|---|---|---|
| The client character set setting differs | SHOW VARIABLES LIKE 'character_set_client'; | Run SET NAMES utf8mb4; |
| Existing data was stored using a different encoding | SELECT HEX(column_name) FROM table_name; | Use CONVERT() or re-export the data |
| The connection encoding is not correct | Connect with mysql --default-character-set=utf8mb4 | Adjust the client-side character set configuration |
| Application settings (PHP/Python, etc.) are incorrect | mysqli_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로 변환할 때 주의사항
안전한 절차
- 현재 데이터 백업
mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
- 데이터베이스 문자 집합 변경
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 테이블 문자 집합 변경
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 데이터 재수입
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
COLLATEwhen needed. - Set
utf8mb4in 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 Set | Max Bytes per Character |
|---|---|
latin1 | 1 byte |
utf8 | 3 bytes |
utf8mb4 | 4 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
LIKEsearches over large datasetsORDER BYprocessing- 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
utf8mb4increases 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
| Item | Recommended Setting | Reason |
|---|---|---|
| Character Set | utf8mb4 | Supports all Unicode characters including emoji and special characters |
| Collation | utf8mb4_unicode_ci | Case-insensitive and suitable for multilingual systems |
| Storage Engine | InnoDB | Good balance of performance and consistency |
| Indexed string length | VARCHAR(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_ci와 utf8mb4_unicode_ci의 차이점
| Collation | Characteristics | Use Case |
|---|---|---|
utf8mb4_general_ci | Faster comparisons, but less accurate | Performance-focused systems |
utf8mb4_unicode_ci | Unicode-standard, more accurate comparisons | General-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 문자 집합 변경에 대한 일반적인 실제 질문들을 모았습니다.
또한 오류 처리 방법과 최적 설정 선택 방법을 다룹니다.
utf8와 utf8mb4의 차이점은 무엇인가요?
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 중 어느 것을 사용해야 할까요?
| Collation | Characteristics | Use Case |
|---|---|---|
utf8mb4_general_ci | Faster comparisons, but less accurate | Performance-focused systems |
utf8mb4_unicode_ci | Unicode-standard, accurate comparisons | General-purpose use (recommended) |
utf8mb4로 전환한 후 쿼리가 느려질까요?
CREATE FULLTEXT INDEX idx_fulltext ON articles(content);
요약
✅ utf8mb4를 권장합니다. 제한 사항 때문에 utf8은 권장되지 않습니다.
✅ 변경하기 전에 항상 SHOW VARIABLES로 설정을 확인하세요.
✅ 문자 깨짐을 방지하기 위해 export/import 워크플로를 사용하세요.
✅ 인덱스 제한을 고려하고 적절히 VARCHAR(191)를 사용하세요.
✅ 성능을 위해 적절한 인덱스를 추가하세요.
최종 참고 사항
MySQL 문자 집합을 변경하는 것은 단순한 설정 조정이 아니라 데이터 무결성과 성능에 영향을 줄 수 있는 중요한 작업입니다.
올바른 설정과 절차를 따르면 utf8mb4로 안전하고 효과적으로 마이그레이션할 수 있습니다.
🔹 이 문서의 단계에 따라 문자 집합을 올바르게 구성하세요! 🔹


