Perbedaan CHAR, VARCHAR, dan TEXT di MySQL

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,...

Perbedaan CHAR, VARCHAR, dan TEXT di MySQL

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 BY tanpa 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.

perbedaan char varchar text mysql tipe data string mysql mysql char vs varchar kapan pakai varchar mysql tipe data mysql mysql text blob
Bagikan artikel
Kembali

Komentar (0)

Punya pertanyaan atau tambahan? Tulis di bawah โ€” tak perlu login.

Membalas komentarโ€ฆ batal

Belum ada komentar. Jadilah yang pertama!

๐Ÿš€ Partner Recommendation

Butuh Source Code & Aplikasi Premium?

Download aplikasi Laravel, POS, Sekolah, Klinik, ERP, dan source code siap pakai di GudangCode.

GudangCode
  • โœ” Source Code Premium
  • โœ” Sistem Siap Pakai
  • โœ” Lifetime Update
  • โœ” Membership Lifetime
  • โœ” Update Aplikasi Harian
Daftar Membership โ†’