Saat merancang tabel di MySQL, salah satu keputusan penting adalah memilih tipe data yang tepat untuk kolom teks. MySQL menyediakan beberapa tipe data untuk menyimpan string: CHAR, VARCHAR, dan TEXT (beserta variannya). Memilih tipe yang salah bisa berdampak pada performa query, penggunaan penyimpanan, dan bahkan fungsionalitas aplikasi. Artikel ini membahas perbedaan mendetail antara ketiganya.
CHAR โ Panjang Tetap
CHAR adalah tipe data string dengan panjang tetap (fixed-length). Jika Anda mendefinisikan CHAR(10) dan menyimpan string "Halo" (4 karakter), MySQL akan mengisi sisa ruang dengan spasi hingga panjangnya menjadi 10 karakter. Ketika data dibaca, spasi tambahan di akhir akan dihapus otomatis.
- Panjang maksimum: 255 karakter.
- Penyimpanan: Selalu menggunakan ruang sebesar yang didefinisikan.
- Cocok untuk: Data dengan panjang yang sudah pasti dan seragam.
-- Contoh penggunaan CHAR
CREATE TABLE kode_negara (
kode CHAR(2) NOT NULL PRIMARY KEY, -- ID, US, MY, SG
nama_negara VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
CREATE TABLE kartu_member (
no_kartu CHAR(16) NOT NULL PRIMARY KEY, -- selalu 16 digit
nama_pemegang VARCHAR(100) NOT NULL,
tipe CHAR(1) NOT NULL -- 'G' = Gold, 'S' = Silver, 'P' = Platinum
) ENGINE=InnoDB;
VARCHAR โ Panjang Bervariasi
VARCHAR adalah tipe data string dengan panjang variabel (variable-length). MySQL hanya menyimpan karakter yang benar-benar ada, ditambah 1 atau 2 byte sebagai prefiks panjang. Jika Anda mendefinisikan VARCHAR(255) dan menyimpan "Halo" (4 karakter), hanya 5 byte yang digunakan (4 karakter + 1 byte prefiks).
- Panjang maksimum: 65.535 karakter (tergantung row size limit dan charset).
- Penyimpanan: Sesuai panjang data aktual + 1-2 byte overhead.
- Cocok untuk: Data teks dengan panjang bervariasi seperti nama, email, atau judul.
-- Contoh penggunaan VARCHAR
CREATE TABLE pengguna (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(150) NOT NULL UNIQUE,
nama_lengkap VARCHAR(200) NOT NULL,
no_telepon VARCHAR(15),
kota VARCHAR(100),
dibuat_pada DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
TEXT dan Variannya
Tipe TEXT digunakan untuk menyimpan teks yang sangat panjang, seperti isi artikel, deskripsi produk panjang, atau komentar. TEXT memiliki beberapa varian dengan kapasitas berbeda:
TINYTEXT: Maksimum 255 bytes.TEXT: Maksimum 65.535 bytes (~64 KB).MEDIUMTEXT: Maksimum 16.777.215 bytes (~16 MB).LONGTEXT: Maksimum 4.294.967.295 bytes (~4 GB).
-- Contoh penggunaan TEXT
CREATE TABLE artikel_blog (
id INT AUTO_INCREMENT PRIMARY KEY,
judul VARCHAR(255) NOT NULL,
ringkasan VARCHAR(500),
isi_artikel MEDIUMTEXT NOT NULL, -- untuk konten artikel panjang
meta_deskripsi VARCHAR(160),
dibuat_pada DATETIME DEFAULT CURRENT_TIMESTAMP,
FULLTEXT INDEX ft_judul_isi (judul, isi_artikel)
) ENGINE=InnoDB;
Perbedaan Utama dalam Tabel
-- Demonstrasi perbedaan penyimpanan
CREATE TABLE demo_tipe_string (
id INT AUTO_INCREMENT PRIMARY KEY,
kolom_char CHAR(20), -- selalu 20 bytes (jika latin1)
kolom_varchar VARCHAR(20), -- variatif, maks 20 karakter
kolom_text TEXT -- maks 65.535 bytes, disimpan di luar row
) ENGINE=InnoDB;
INSERT INTO demo_tipe_string (kolom_char, kolom_varchar, kolom_text)
VALUES ('Halo', 'Halo', 'Halo');
-- Cek panjang yang tersimpan
SELECT
LENGTH(kolom_char) AS panjang_char, -- 4 (spasi dipotong saat baca)
LENGTH(kolom_varchar) AS panjang_varchar, -- 4
LENGTH(kolom_text) AS panjang_text -- 4
FROM demo_tipe_string;
Perbedaan Perilaku Spasi
-- CHAR memotong spasi di belakang saat perbandingan
CREATE TABLE test_spasi (
c CHAR(5),
v VARCHAR(5)
) ENGINE=InnoDB;
INSERT INTO test_spasi VALUES ('abc ', 'abc ');
-- Pada CHAR, 'abc ' dianggap sama dengan 'abc'
-- Pada VARCHAR, 'abc ' TIDAK sama dengan 'abc'
SELECT
c = 'abc' AS char_sama, -- 1 (TRUE)
v = 'abc' AS varchar_sama -- 0 (FALSE)
FROM test_spasi;
Keterbatasan TEXT
Meskipun fleksibel, tipe TEXT memiliki beberapa keterbatasan penting:
- Kolom TEXT tidak bisa memiliki nilai DEFAULT.
- Kolom TEXT tidak bisa sepenuhnya diindeks โ hanya bisa partial index dengan prefix length.
- Data TEXT disimpan di luar row utama, sehingga akses bisa lebih lambat.
- Kolom TEXT tidak bisa digunakan langsung di
GROUP BYtanpa prefix.
-- Membuat partial index pada kolom TEXT
CREATE TABLE dokumen (
id INT AUTO_INCREMENT PRIMARY KEY,
judul VARCHAR(255) NOT NULL,
konten TEXT,
INDEX idx_konten_prefix (konten(100)) -- index 100 karakter pertama
) ENGINE=InnoDB;
Panduan Memilih Tipe Data
- Gunakan CHAR untuk: kode pos, kode negara, nomor plat, status (1 karakter), atau data yang selalu panjangnya sama.
- Gunakan VARCHAR untuk: nama, email, username, judul, URL, nomor telepon, atau teks pendek hingga menengah yang panjangnya bervariasi.
- Gunakan TEXT untuk: isi artikel, deskripsi panjang, konten HTML, atau teks apa pun yang bisa melebihi 255 karakter.
Kesimpulan
CHAR, VARCHAR, dan TEXT masing-masing dirancang untuk kebutuhan yang berbeda. CHAR efisien untuk data panjang tetap, VARCHAR fleksibel untuk teks bervariasi, dan TEXT untuk konten yang sangat panjang. Memilih tipe data yang tepat tidak hanya mempengaruhi efisiensi penyimpanan, tetapi juga performa query dan kemampuan indexing. Selalu pertimbangkan panjang maksimum data yang akan disimpan dan apakah kolom tersebut perlu diindeks saat memilih antara ketiganya.