Panduan Mengubah Set Karakter MySQL: Konversi ke utf8mb4 (Perbaiki Mojibake)

目次

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.

  1. Mojibake (karakter rusak)
  • utf8 dan latin1 tercampur dalam lingkungan yang sama
  • Pengaturan set karakter klien dan server tidak cocok
  1. Masalah saat pencarian
  • Karena perbedaan kolasi, hasil pencarian yang diharapkan tidak muncul
  • Urutan penyortiran berbeda dari yang Anda harapkan
  1. Masalah selama migrasi data
  • Emoji dan simbol khusus tidak dapat disimpan karena utf8mb4 tidak 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

  1. Pengetahuan dasar tentang set karakter MySQL
  2. Cara memeriksa set karakter saat ini
  3. Cara mengubah set karakter MySQL
  4. Pemecahan masalah setelah perubahan
  5. Bagaimana perubahan set karakter memengaruhi kinerja
  6. Pengaturan yang direkomendasikan (praktik terbaik)
  7. 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 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

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

CollationDescription
utf8_general_ciCase-insensitive, suitable for general use
utf8_unicode_ciUnicode-based collation (recommended)
utf8mb4_binBinary 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 SetMax BytesEmoji SupportRecommendation
utf83 bytes❌ Not supported❌ Not recommended
utf8mb44 bytes✅ Supported✅ Recommended

Mengapa Anda Harus Beralih dari utf8 ke utf8mb4

  1. Kompatibilitas masa depan : Sistem modern semakin menstandarisasi pada utf8mb4 .
  2. Menyimpan karakter khusus dan emoji : Dengan utf8mb4 , Anda dapat menangani data pada posting SNS dan aplikasi pesan dengan aman.
  3. Internasionalisasi : Untuk sistem multibahasa, hal ini mengurangi risiko mojibake.

Ringkasan

  • Set karakter menentukan bagaimana data disimpan dan diproses.
  • Kolasi menentukan bagaimana karakter dibandingkan.
  • utf8 MySQL terbatas pada 3 byte, sehingga utf8mb4 direkomendasikan.
  • utf8mb4_unicode_ci adalah 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 → Not utf8mb4 , so a change is needed
  • COLLATE=latin1_swedish_ci → Switching to utf8mb4_unicode_ci is 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 VARIABLES and SHOW CREATE TABLE to 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

  1. 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
  1. Add or change the character set settings Add or update the following lines under the mysqld section.
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
  1. Mulai Ulang MySQL
    sudo systemctl restart mysql
    

Di Windows:

net stop MySQL && net start MySQL
  1. 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.cnf dan set character-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.

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

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

  1. Cadangkan data saat ini
    mysqldump -u root -p --default-character-set=latin1 mydatabase > backup.sql
    
  1. Ubah set karakter database
    ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. Ubah set karakter tabel
    ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  1. 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 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;

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

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, more accurate comparisonsGeneral-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_ci direkomendasikan.
  • Standarisasi pengaturan server (my.cnf) dan set karakter koneksi.
  • Secara eksplisit tentukan utf8mb4 pada tingkat basis data, tabel, dan kolom.
  • Gunakan VARCHAR(191) untuk menghindari batas panjang kunci indeks.
  • Gunakan utf8mb4_unicode_ci untuk 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?

CollationCharacteristicsUse Case
utf8mb4_general_ciFaster comparisons, but less accuratePerformance-focused systems
utf8mb4_unicode_ciUnicode-standard, accurate comparisonsGeneral-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! 🔹