- 1 1. Pendahuluan
- 2 2. Apa Itu Set Karakter MySQL? Memahami Dasarnya
- 3 3. Cara Memeriksa Set Karakter Saat Ini
- 4 4. How to Change the MySQL Character Set
- 5 5. Pemecahan Masalah Setelah Mengubah Set Karakter
- 6 6. How Character Set Changes Affect Performance
- 7 7. Recommended Settings (Best Practices)
- 8 8. FAQ
- 8.1 Apa perbedaan antara utf8 dan utf8mb4?
- 8.2 Apakah mengubah set karakter MySQL dapat menyebabkan kehilangan data?
- 8.3 Bagaimana cara memperbaiki mojibake jika terjadi?
- 8.4 Apa risiko saat mengonversi dari latin1 ke utf8mb4?
- 8.5 Apakah beralih ke utf8mb4 memengaruhi kinerja?
- 8.6 Mana yang harus saya gunakan: utf8mb4_general_ci atau utf8mb4_unicode_ci?
- 8.7 Apakah kueri akan menjadi lebih lambat setelah beralih ke utf8mb4?
- 8.8 Ringkasan
- 8.9 Catatan Akhir
1. Pendahuluan
Mengapa Anda Mungkin Perlu Mengubah Set Karakter MySQL
Set karakter basis data adalah pengaturan penting yang menentukan bagaimana data teks dienkode dan diproses untuk penyimpanan. Di MySQL, set karakter default sering kali latin1, yang dapat menimbulkan masalah saat bekerja dengan bahasa Jepang atau karakter khusus lainnya. Terutama selama migrasi data atau standarisasi sistem, beralih ke set karakter yang tepat menjadi sangat penting.
Masalah Umum dan Penyebabnya
Masalah tipikal yang terkait dengan set karakter MySQL meliputi hal‑hal berikut.
- Mojibake (karakter rusak)
utf8danlatin1tercampur dalam lingkungan yang sama- Pengaturan set karakter klien dan server tidak cocok
- Masalah saat pencarian
- Karena perbedaan kolasi, hasil pencarian yang diharapkan tidak muncul
- Urutan penyortiran berbeda dari yang Anda harapkan
- Masalah selama migrasi data
- Emoji dan simbol khusus tidak dapat disimpan karena
utf8mb4tidak digunakan - Konversi set karakter tidak ditangani dengan benar selama ekspor/impor
Tujuan Artikel dan Struktur
Artikel ini memberikan penjelasan komprehensif tentang perubahan set karakter MySQL, mulai dari konsep dasar hingga cara mengubah pengaturan dan pemecahan masalah.
Garis Besar
- Pengetahuan dasar tentang set karakter MySQL
- Cara memeriksa set karakter saat ini
- Cara mengubah set karakter MySQL
- Pemecahan masalah setelah perubahan
- Bagaimana perubahan set karakter memengaruhi kinerja
- Pengaturan yang direkomendasikan (praktik terbaik)
- FAQ (pertanyaan yang sering diajukan)
Dengan membaca panduan ini, Anda akan memperdalam pemahaman tentang set karakter MySQL dan dapat memilih pengaturan yang tepat serta menghindari masalah umum.
2. Apa Itu Set Karakter MySQL? Memahami Dasarnya
Apa Itu Set Karakter?
Set karakter (Character Set) adalah kumpulan aturan yang digunakan untuk menyimpan dan memproses karakter sebagai data digital. Misalnya, saat menyimpan karakter Jepang “あ”, UTF-8 merepresentasikannya sebagai urutan byte E3 81 82, sementara Shift_JIS menggunakan 82 A0.
Di MySQL, Anda dapat menentukan set karakter yang berbeda pada tingkat basis data atau tabel. Dengan memilih set karakter yang tepat, Anda dapat mencegah mojibake dan membuat internasionalisasi lebih lancar.
Set Karakter Umum
| 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 |
Apa Itu Kolasi?
Kolasi adalah kumpulan aturan yang digunakan untuk membandingkan dan menyortir data dalam sebuah set karakter. Misalnya, kolasi menentukan apakah “A” dan “a” diperlakukan sebagai karakter yang sama dan bagaimana urutan penataan ditentukan.
Kolasi yang Sering Digunakan
| 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) |
Perbedaan Antara utf8 dan utf8mb4
utf8 di MySQL sebenarnya hanya dapat menyimpan hingga 3 byte per karakter, sehingga tidak dapat menangani beberapa karakter khusus (seperti emoji atau beberapa karakter CJK yang diperluas). Sebaliknya, utf8mb4 mendukung hingga 4 byte per karakter, itulah mengapa aplikasi modern disarankan menggunakan utf8mb4.
| Character Set | Max Bytes | Emoji Support | Recommendation |
|---|---|---|---|
utf8 | 3 bytes | ❌ Not supported | ❌ Not recommended |
utf8mb4 | 4 bytes | ✅ Supported | ✅ Recommended |
Mengapa Anda Harus Beralih dari utf8 ke utf8mb4
- Kompatibilitas masa depan : Sistem modern semakin menstandarisasi pada
utf8mb4. - Menyimpan karakter khusus dan emoji : Dengan
utf8mb4, Anda dapat menangani data pada posting SNS dan aplikasi pesan dengan aman. - Internasionalisasi : Untuk sistem multibahasa, hal ini mengurangi risiko mojibake.
Ringkasan
- Set karakter menentukan bagaimana data disimpan dan diproses.
- Kolasi menentukan bagaimana karakter dibandingkan.
utf8MySQL terbatas pada 3 byte, sehinggautf8mb4direkomendasikan.utf8mb4_unicode_ciadalah kolasi yang sering direkomendasikan untuk penggunaan umum.
3. Cara Memeriksa Set Karakter Saat Ini
Sebelum mengubah set karakter MySQL, penting untuk memeriksa pengaturan saat ini.
Karena set karakter dapat diatur pada beberapa level (basis data, tabel, kolom), Anda harus memahami secara tepat di mana perubahan diperlukan.
Cara Memeriksa Set Karakter Saat Ini
Periksa Set Karakter Seluruh Server MySQL
First, check the default character set and collation settings for the entire MySQL server.
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Example output:
+--------------------------+----------------------------+
| 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 |
+--------------------------+----------------------------+
Check the Character Set per Database
To check the character set for a specific database, use the following query.
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';
Example output
+----------------+----------------------+----------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------+----------------------+----------------------+
| my_database | utf8mb4 | utf8mb4_unicode_ci |
+----------------+----------------------+----------------------+
Check a Table’s Character Set
This is how to check the character set for a specific table.
SHOW CREATE TABLE table_name;
Example output
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;
Checkpoints
DEFAULT CHARSET=latin1→ Notutf8mb4, so a change is neededCOLLATE=latin1_swedish_ci→ Switching toutf8mb4_unicode_ciis usually more appropriate
Check a Column’s Character Set
To inspect the character set at the column level, run the following SQL.
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'database_name'
AND TABLE_NAME = 'table_name';
Example output
+-------------+--------------------+----------------------+
| COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME |
+-------------+--------------------+----------------------+
| name | latin1 | latin1_swedish_ci |
| email | utf8mb4 | utf8mb4_unicode_ci |
+-------------+--------------------+----------------------+
In this example, the name column uses latin1, so it is recommended to change it to utf8mb4.
Summary
- MySQL character sets are configured at multiple levels (server, database, table, column).
- By checking the character set at each level, you can apply the right changes.
- Use commands like
SHOW VARIABLESandSHOW CREATE TABLEto fully understand the current configuration.

4. How to Change the MySQL Character Set
By changing the MySQL character set appropriately, you can prevent mojibake and support multilingual data more smoothly.
In this section, we explain how to update settings at each level: server-wide, database, table, and column.
Change the Server-Wide Default Character Set
To change the server-wide default character set, you need to edit the MySQL configuration file (my.cnf or my.ini).
Steps
- Open the configuration file
- On Linux:
bash sudo nano /etc/mysql/my.cnf On Windows: wp:list /wp:list
- Open
C:\ProgramData\MySQL\MySQL Server X.X\my.ini
- Open
- Add or change the character set settings Add or update the following lines under the
mysqldsection.[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
- Mulai Ulang MySQL
sudo systemctl restart mysql
Di Windows:
net stop MySQL && net start MySQL
- Verifikasi perubahan
SHOW VARIABLES LIKE 'character_set_server';
Ubah Set Karakter pada Tingkat Database
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Verifikasi perubahan
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'mydatabase';
Ubah Set Karakter pada Tingkat Tabel
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Verifikasi perubahan
SHOW CREATE TABLE users;
Ubah Set Karakter pada Tingkat Kolom
ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Verifikasi perubahan
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mydatabase'
AND TABLE_NAME = 'users';
Verifikasi Pasca-Perubahan dan Pentingnya Cadangan
Untuk menjaga integritas data setelah mengubah set karakter, ikuti langkah-langkah berikut.
Cadangkan data Anda
mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql
Periksa kembali pengaturan
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE TABLE users;
Masukkan dan tampilkan data uji
INSERT INTO users (name, email) VALUES ('Test User', 'test@example.com');
SELECT * FROM users;
Ringkasan
- Perubahan set karakter seluruh server : Edit
my.cnfdan setcharacter-set-server=utf8mb4 - Perubahan set karakter database :
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 - Perubahan set karakter tabel :
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 - Perubahan set karakter kolom :
ALTER TABLE users MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 - Setelah perubahan, selalu verifikasi pengaturan dan uji data Anda
5. Pemecahan Masalah Setelah Mengubah Set Karakter
Setelah mengubah set karakter MySQL, Anda mungkin menemukan kasus di mana sistem tidak berfungsi dengan benar atau data yang disimpan menjadi berantakan.
Di bagian ini, kami menjelaskan masalah umum dan cara memperbaikinya secara detail.
Penyebab Mojibake dan Cara Memperbaikinya
Jika mojibake terjadi setelah mengubah set karakter, penyebab berikut ini umum terjadi.
| 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 |
Perbaikan #1: Atur set karakter klien dengan benar
SET NAMES utf8mb4;
Perbaikan #2: Konversi data yang ada dengan tepat
UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);
Catatan Saat Mengonversi dari latin1 ke utf8mb4
Prosedur aman
- Cadangkan data saat ini
mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
- Ubah set karakter database
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Ubah set karakter tabel
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Impor ulang data
mysql -u root -p --default-character-set=utf8mb4 mydatabase < backup.sql
Data Tidak Dapat Dicari Setelah Perubahan
Kasus #1: Pencarian LIKE tidak berfungsi
SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci LIKE '%Tanaka%';
Kasus #2: Urutan pengurutan berubah
SELECT * FROM users ORDER BY BINARY name;
Langkah-Langkah di Sisi Aplikasi
Untuk PHP
mysqli_set_charset($conn, 'utf8mb4');
Untuk 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;
Ubah Set Karakter untuk Tabel yang Ada
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Perbedaan Antara utf8mb4_general_ci dan 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) |
✅ Jika Anda membutuhkan dukungan multibahasa atau pengurutan yang akurat, pilih utf8mb4_unicode_ci.
Optimasi Indeks
CREATE FULLTEXT INDEX idx_fulltext ON articles(content);
Ringkasan
- Kombinasi
utf8mb4+utf8mb4_unicode_cidirekomendasikan. - Standarisasi pengaturan server (
my.cnf) dan set karakter koneksi. - Secara eksplisit tentukan
utf8mb4pada tingkat basis data, tabel, dan kolom. - Gunakan
VARCHAR(191)untuk menghindari batas panjang kunci indeks. - Gunakan
utf8mb4_unicode_ciuntuk perbandingan yang akurat.
8. FAQ
Berikut adalah pertanyaan umum dunia nyata tentang mengubah set karakter MySQL.
Kami juga membahas cara menangani kesalahan dan cara memilih pengaturan terbaik.
Apa perbedaan antara utf8 dan utf8mb4?
SHOW VARIABLES LIKE 'character_set_server';
Apakah mengubah set karakter MySQL dapat menyebabkan kehilangan data?
mysqldump -u root -p --default-character-set=utf8mb4 mydatabase > backup.sql
Bagaimana cara memperbaiki mojibake jika terjadi?
UPDATE users SET name = CONVERT(CAST(CONVERT(name USING latin1) AS BINARY) USING utf8mb4);
Apa risiko saat mengonversi dari latin1 ke utf8mb4?
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Apakah beralih ke utf8mb4 memengaruhi kinerja?
ALTER TABLE users MODIFY COLUMN email VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Mana yang harus saya gunakan: utf8mb4_general_ci atau 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) |
Apakah kueri akan menjadi lebih lambat setelah beralih ke utf8mb4?
CREATE FULLTEXT INDEX idx_fulltext ON articles(content);
Ringkasan
✅ utf8mb4 direkomendasikan. utf8 tidak direkomendasikan karena keterbatasannya.
✅ Sebelum melakukan perubahan, selalu periksa pengaturan dengan SHOW VARIABLES.
✅ Gunakan alur kerja ekspor/impor untuk mencegah mojibake.
✅ Pertimbangkan batasan indeks dan gunakan VARCHAR(191) bila sesuai.
✅ Untuk kinerja, tambahkan indeks yang tepat.
Catatan Akhir
Mengubah set karakter MySQL bukan sekadar penyesuaian konfigurasi sederhana—ini adalah tugas kritis yang dapat memengaruhi integritas data dan kinerja.
Dengan mengikuti pengaturan dan prosedur yang tepat, Anda dapat bermigrasi ke utf8mb4 dengan aman dan efektif.
🔹 Ikuti langkah-langkah dalam artikel ini dan konfigurasikan set karakter Anda dengan benar! 🔹


