Macam macam tipe data di MySQL adalah pengelompokan format nilai yang menentukan jenis informasi, alokasi ruang memori penyimpanan, serta batasan operasi komputasi pada setiap kolom tabel basis data relasional. Pemilihan tipe data yang presisi memegang peranan krusial dalam merancang arsitektur sistem perangkat lunak berkinerja tinggi. Pasalnya, penentuan tipe data yang keliru dapat memboroskan kapasitas hard drive, memperlambat proses pencarian indeks (indexing), hingga memicu galat perhitungan matematis yang fatal pada aplikasi keuangan.
Faktanya, sistem manajemen basis data relasional MySQL menyediakan beragam variasi tipe data guna mengakomodasi kebutuhan data modern. Melalui panduan komprehensif ini, Anda akan mempelajari klasifikasi lengkap tipe data numerik, karakter string, penanggalan waktu (date and time), hingga format mutakhir seperti tipe data spasial dan JSON native pada MySQL 8.0 yang mengacu pada standar internasional ISO/IEC 9075 SQL. Selain itu, ulasan ini membedah perbedaan teknis mendalam antara CHAR dan VARCHAR, alasan mengapa Anda wajib menghindari FLOAT untuk saldo keuangan, serta fenomena kritis Year 2038 Bug pada kolom TIMESTAMP.
Klasifikasi Utama Macam Macam Tipe Data di MySQL
Sebagai fondasi awal, sistem mengelompokkan macam macam tipe data di MySQL ke dalam lima kategori fungsional utama. Bahkan, setiap kategori memiliki karakteristik penyimpanan biner serta perilaku indeks yang berbeda pada mesin penyimpanan (storage engine) seperti InnoDB. Berikut adalah pembagian lima rumpun besar tipe data tersebut:
- Tipe Data Numerik: Kelompok tipe data untuk menyimpan angka bilangan bulat (integer) maupun angka pecahan desimal (fixed-point dan floating-point).
- Tipe Data String dan Karakter: Kelompok tipe data untuk menampung teks alfabetis, karakter alfanumerik, dokumen teks panjang, maupun data biner mentah.
- Tipe Data Tanggal dan Waktu (Date & Time): Kelompok tipe data khusus untuk merekam pencatatan hari, kalender tanggal, durasi jam kerja, hingga stempel waktu transaksi otomatis.
- Tipe Data JSON (JavaScript Object Notation): Format dokumen semi-terstruktur native yang memfasilitasi penyimpanan dokumen fleksibel layaknya basis data NoSQL di dalam tabel relasional.
- Tipe Data Spasial (Spatial/GIS): Kumpulan tipe data geometris untuk menyimpan koordinat lintang dan bujur (GPS), garis batas wilayah, hingga poligon pemetaan wilayah.

Tipe Data Numerik di MySQL (Bilangan Bulat dan Pecahan)
Tipe data numerik bertugas menangani segala bentuk angka matematis dalam tabel database. Selain itu, administrator sistem membedakan tipe numerik menjadi bilangan bulat tanpa koma serta bilangan pecahan desimal. Oleh karena itu, Anda wajib memperhatikan penggunaan memori pada setiap jenis angka agar efisiensi memori RAM server tetap terjaga secara optimal.
Tabel Spesifikasi Tipe Data Bilangan Bulat (Integer)
Faktanya, pengembang database MySQL menyajikan lima varian bilangan bulat berdasarkan kapasitas bit serta rentang angka masing-masing. Berdasarkan standar resmi komunitas MariaDB.org dan dokumentasi MySQL, atribut SIGNED mengizinkan angka bernilai minus, sementara atribut UNSIGNED hanya menampung angka positif sehingga melipatgandakan batas angka positifnya:
| Tipe Data | Ukuran Memori | Jangkauan Signed (Minus & Positif) | Jangkauan Unsigned (Positif Saja) | Contoh Kasus Ideal |
|---|---|---|---|---|
| TINYINT | 1 Byte | -128 s/d 127 | 0 s/d 255 | Nilai umur manusia, kode status verifikasi, nilai rating bintang 1 s/d 5. |
| SMALLINT | 2 Bytes | -32.768 s/d 32.767 | 0 s/d 65.535 | Jumlah halaman buku, jumlah kursi gedung bioskop, kode tahun kalender. |
| MEDIUMINT | 3 Bytes | -8.388.608 s/d 8.388.607 | 0 s/d 16.777.215 | Kode pos wilayah perkotaan, populasi distrik, inventaris stok toko besar. |
| INT / INTEGER | 4 Bytes | -2,14 Miliar s/d 2,14 Miliar | 0 s/d 4.294.967.295 | Kunci utama auto-increment (Primary Key ID pengguna), pencatatan invoice. |
| BIGINT | 8 Bytes | -9 Quintillion s/d +9 Quintillion | 0 s/d 18.446.744.073.709.551.615 | Pencatatan volume view video berskala miliaran (YouTube), nomor seri kartu bank. |
Tipe Pecahan: Mengapa Wajib Menghindari FLOAT untuk Saldo Keuangan
Ketika menangani angka berkoma atau nilai desimal, pengembang pemula sering kali salah memilih tipe FLOAT atau DOUBLE karena mengira tipe tersebut cocok untuk segala keperluan. Padahal, FLOAT (4 bytes) dan DOUBLE (8 bytes) merupakan tipe aproksimasi berbasis standar biner IEEE 754. Akibat sifat aproksimasi tersebut, kalkulasi desimal tertentu seperti 0,1 + 0,2 dapat menghasilkan nilai 0,30000000000000004 di tingkat CPU server.
Oleh sebab itu, Anda wajib menggunakan tipe DECIMAL(M, D) atau sinonimnya NUMERIC saat mengelola data keuangan, nominal harga produk e-commerce, atau saldo dompet digital. Tipe DECIMAL menyimpan setiap digit angka sebagai representasi string biner pasti (exact fixed-point). Sebagai contoh nyata, deklarasi DECIMAL(12, 2) mengartikan kolom sanggup menampung total 12 digit angka dengan 2 digit presisi di belakang koma (maksimal 9.999.999.999,99) tanpa risiko kehilangan satu rupiah pun akibat galat pembulatan mesin.
Tipe Khusus: BOOLEAN dan BIT
Sebagian pengembang kerap menanyakan keberadaan tipe data Boolean murni di dalam MySQL. Secara teknis internal, tipe BOOLEAN atau BOOL hanyalah alias bagi TINYINT(1). Sistem menganggap angka 0 sebagai representasi nilai FALSE, sementara angka 1 merepresentasikan nilai TRUE. Sementara itu, tipe BIT(M) berfungsi menyimpan untaian nilai biner murni dari 1 hingga 64 bit, yang sangat efisien untuk menyimpan kombinasi opsi bendera perizinan hak akses pengguna (permission flags).
Tipe Data Karakter dan String di MySQL
Sementara itu, kategori teks menangani seluruh kebutuhan informasi berbasis alfabetis, mulai dari kode singkat dua huruf hingga isi naskah artikel buku ribuan halaman. Memilih jenis string yang tepat secara langsung memengaruhi alokasi ruang pada tabel InnoDB.

Perbedaan Mendalam CHAR vs VARCHAR
Dua tipe data karakter yang paling sering bersanding adalah CHAR dan VARCHAR. Walaupun keduanya sama-sama menampung karakter teks, mekanisme penyimpanan keduanya sangat bertolak belakang:
- CHAR(M): Menyimpan teks dengan panjang karakter tetap (fixed-length) antara 0 hingga 255 karakter. Jika Anda mendeklarasikan
CHAR(10)lalu memasukkan kata “KOPI” (4 karakter), mesin basis data akan otomatis menambahkan 6 spasi kosong di sisi kanan kata guna menggenapi ukuran 10 karakter. Karakteristik ini membuatCHARbekerja sangat cepat dalam pencarian karena posisi pointer memori selalu konsisten. GunakanCHARuntuk data seragam seperti kode negara ISO (CHAR(2)), nomor induk kependudukan (NIK 16 digit), atau hash sandi MD5/SHA-256. - VARCHAR(M): Menyimpan teks dengan panjang dinamis (variable-length) hingga maksimal 65.535 bytes per baris tabel. Jika Anda menyimpan kata “KOPI” pada kolom
VARCHAR(100), MySQL hanya menggunakan ruang 4 byte untuk teks beserta 1 byte penanda panjang data. Dengan demikian, Anda menghemat ruang penyimpanan hard drive secara signifikan. GunakanVARCHARuntuk data yang panjangnya bervariasi seperti nama lengkap pengguna, alamat email, judul artikel, dan nama kota.
Kategori Teks Panjang: TINYTEXT, TEXT, MEDIUMTEXT, dan LONGTEXT
Ketika panjang naskah teks melampaui batas kewajaran kolom VARCHAR, Anda perlu beralih ke rumpun tipe TEXT. Berbeda dari VARCHAR yang tersimpan langsung di dalam baris data utama, mesin InnoDB memindahkan naskah TEXT berukuran besar ke halaman penyimpanan luapan terpisah (overflow pages), sehingga hanya menyisakan pointer 20-byte di dalam tabel utama.
| Tipe Teks | Kapasitas Maksimal Karakter | Ukuran Penyimpanan Maksimal | Rekomendasi Penerapan |
|---|---|---|---|
| TINYTEXT | 255 Karakter | 255 Bytes | Ringkasan kutipan pendek, catatan satu kalimat. |
| TEXT | 65.535 Karakter | 64 KB | Deskripsi detail produk e-commerce, ulasan pelanggan. |
| MEDIUMTEXT | 16.777.215 Karakter | 16 MB | Naskah bab buku digital, transkrip wawancara lengkap. |
| LONGTEXT | 4.294.967.295 Karakter | 4 GB | Dokumen XML/JSON raksasa, berkas log audit historis tahunan. |
Tipe Pilihan Terbatas: ENUM dan SET
Selain teks bebas, MySQL menghadirkan dua tipe khusus untuk membatasi opsi input data. Tipe ENUM membatasi isian kolom hanya pada satu opsi terpilih dari daftar yang perancang tetapkan di awal skema (misalnya ENUM('draft', 'published', 'archived')). Di balik layar, MySQL menyimpan nilai ENUM sebagai angka integer 1 byte atau 2 bytes, sehingga proses pencarian berjalan sangat gesit. Sementara itu, tipe SET memungkinkan kolom menampung nol, satu, atau beberapa opsi sekaligus dari daftar pilihan yang tersedia.
Tipe Data Tanggal dan Waktu (Date and Time)
Selanjutnya, pencatatan linimasa merupakan bagian krusial dari setiap sistem aplikasi. Menentukan tipe tanggal yang tepat sangat berpengaruh terhadap akurasi zona waktu (time zone) dan durasi masa pakai sistem di masa depan.
| Tipe Waktu | Format Tampilan Baku | Jangkauan Rentang Waktu | Konsumsi Memori | Karakteristik Zona Waktu |
|---|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 s/d 9999-12-31 | 3 Bytes | Bebas konversi zona waktu (statik). |
| TIME | HH:MM:SS | -838:59:59 s/d 838:59:59 | 3 Bytes | Menyimpan durasi waktu interval atau jam harian. |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 s/d 9999-12-31 | 5 Bytes (+ fractional) | Menyimpan nilai riil tanpa konversi otomatis zona waktu. |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 s/d 2038-01-19 | 4 Bytes (+ fractional) | Otomatis konversi ke UTC saat simpan, balik ke lokal saat baca. |
| YEAR | YYYY | 1901 s/d 2155 | 1 Byte | Penyimpanan tahun kalender angka 4 digit. |
Perbedaan Krusial DATETIME vs TIMESTAMP dan Ancaman Y2038 Bug
Banyak pengembang sering menyepelekan perbedaan antara DATETIME dan TIMESTAMP. Faktanya, tipe TIMESTAMP menyimpan waktu dalam bentuk angka integer 32-bit yang menghitung detik berlalu sejak tanggal 1 Januari 1970 UTC (Unix Epoch). Akibat struktur 32-bit tersebut, kapasitas angka TIMESTAMP akan mengalami luapan batas maksimal (overflow) pada tanggal 19 Januari 2038 pukul 03:14:07 UTC. Peristiwa ini populer sebagai ancaman Year 2038 Problem (Bug Y2038).
Sebaliknya, tipe DATETIME menyimpan representasi penanggalan secara independen menggunakan alokasi memori 5 bytes, sehingga mampu menjangkau masa depan yang sangat jauh hingga tahun 9999 tanpa terikat batas 32-bit. Oleh sebab itu, gunakan TIMESTAMP hanya untuk pencatatan otomatis audit sistem (seperti kolom created_at dan updated_at) yang bergantung pada penyesuaian zona waktu global. Namun, untuk tanggal lahir pengguna, kontrak perjanjian jangka panjang, atau jadwal masa depan, Anda wajib memilih tipe DATETIME.
Tipe Data Modern: JSON dan Tipe Spasial (MySQL 8.0)
Di samping itu, evolusi teknologi basis data menuntut MySQL mampu mengolah data non-relasional tanpa harus mengorbankan integritas model relasional ACID. Sejak rilis MySQL 5.7 dan berlanjut ke MySQL 8.0, mesin basis data ini mendukung tipe data dokumen modern berkecepatan tinggi.

Keunggulan Tipe Data Native JSON
Sebagai pertimbangan teknis, menyimpan teks JSON di dalam kolom VARCHAR atau TEXT biasa menimbulkan risiko kerusakan struktur karena ketiadaan validasi otomatis. Sebaliknya, tipe data native JSON di MySQL menyediakan validasi sintaks secara ketat saat perintah INSERT berlangsung. Jika dokumen bukan format JSON yang valid, sistem akan langsung menolak transaksi.
Selain itu, MySQL mengonversi dokumen JSON ke dalam format biner internal teroptimasi. Format biner ini memungkinkan mesin membaca elemen kunci dokumen secara instan tanpa perlu membedah ulang keseluruhan teks dokumen. Anda dapat mengekstrak atribut dokumen secara langsung melalui operator panah inline -> dan ->>:
-- Mengambil nilai atribut nama dari kolom profil berformat JSON
SELECT id, profil->>'$.nama' AS nama_lengkap
FROM pengguna
WHERE profil->>'$.kota' = 'Jakarta';
Tipe Data Spasial untuk Pemetaan Geografis (GIS)
Bagi aplikasi yang memerlukan fitur lokasi seperti layanan transportasi online atau peta navigasi, MySQL menyematkan rumpun tipe spasial berbasis standar Open Geospatial Consortium (OGC). Varian utamanya mencakup POINT untuk merekam titik koordinat lintang dan bujur (latitude/longitude), LINESTRING untuk menggambarkan jalur jalan raya, serta POLYGON untuk mendefinisikan batas area wilayah administratif. Bahkan, kolom spasial mendukung pembuatan indeks khusus SPATIAL INDEX (R-tree) guna mempercepat pencarian radius jarak lokasi terdekat.
Contoh Implementasi Skrip SQL dan Perintah Modifikasi Kolom
Guna mempraktikkan pemahaman teoritis macam macam tipe data di MySQL ke dalam skenario nyata, perhatikan contoh skrip pembuatan tabel pesanan e-commerce berikut yang memadukan beragam tipe data secara harmonis:
CREATE TABLE transaksi_pesanan (
id_pesanan BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nomor_invoice CHAR(16) NOT NULL UNIQUE,
id_pelanggan INT UNSIGNED NOT NULL,
total_belanja DECIMAL(12, 2) NOT NULL DEFAULT 0.00,
status_pembayaran ENUM('tertunda', 'lunas', 'batal') NOT NULL DEFAULT 'tertunda',
detail_keranjang JSON NOT NULL,
catatan_pengiriman VARCHAR(255) NULL,
waktu_transaksi DATETIME NOT NULL,
diperbarui_pada TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_pelanggan (id_pelanggan),
INDEX idx_waktu (waktu_transaksi)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Cara Mengubah Tipe Data Kolom (ALTER TABLE)
Bahkan, dalam siklus pengembangan aplikasi, kebutuhan memperluas kapasitas tipe data kerap terjadi seiring pertambahan volume data pengguna. Anda dapat mengubah tipe data kolom pada tabel yang sudah beroperasi menggunakan perintah ALTER TABLE berikut:
-- Mengubah tipe data kolom id_pelanggan dari INT menjadi BIGINT
ALTER TABLE transaksi_pesanan
MODIFY COLUMN id_pelanggan BIGINT UNSIGNED NOT NULL;
-- Mengubah nama sekaligus tipe data kolom menggunakan CHANGE
ALTER TABLE transaksi_pesanan
CHANGE COLUMN catatan_pengiriman instruksi_kurir TEXT NULL;
Tips Efisiensi Memilih Tipe Data untuk Optimasi Basis Data
Faktanya, kinerja server basis data sangat bergantung pada kebiasaan Anda dalam memilih tipe data. Terapkan empat prinsip rancang bangun berikut guna menjaga efisiensi pemakaian memori server:
- Gunakan Tipe Data Terkecil yang Memadai: Jika suatu kolom hanya menampung angka 1 hingga 100, pilih
TINYINT UNSIGNED(1 byte) alih-alihINT(4 bytes). Penghematan 3 bytes per baris akan berdampak luar biasa ketika tabel menampung jutaan baris data. - Alokasikan Ruang RAM InnoDB Buffer Pool Secara Cermat: Tipe data yang ringkas memungkinkan mesin InnoDB memuat lebih banyak baris data ke dalam memori RAM utama. Anda dapat mendalami prinsip pemanfaatan memori kerja perangkat keras pada ulasan perbedaan RAM dan ROM.
- Selalu Gunakan Charset utf8mb4: Standar pengkodean
utf8mb4mendukung seluruh karakter internasional termasuk emoji modern. Namun ingat bahwautf8mb4mengalokasikan hingga 4 bytes per karakter, sehingga perhitungkan panjangVARCHARsecara bijak agar tidak melampaui batas baris InnoDB. - Hindari Penyimpanan Berkas Biner Raksasa (BLOB) di Database: Jangan menyimpan file foto atau video langsung ke dalam kolom
LONGBLOBdatabase. Praktik terbaik industri menyarankan Anda menyimpan file media di penyimpanan objek penyimpanan awan (cloud storage), lalu mencatat URL tautan string medianya saja di dalam kolomVARCHARtabel.
Pertanyaan Umum Seputar Tipe Data di MySQL (FAQ)
Berikut adalah rangkuman tanya jawab penting seputar pemilihan, batasan teknis, dan fungsi tipe data di MySQL:
Apa itu macam macam tipe data di MySQL dan apa fungsinya?
Macam macam tipe data di MySQL adalah format penetapan nilai kolom yang mengontrol jenis data yang dapat tersimpan, batasan jangkauan angka atau teks, serta alokasi memori biner pada media penyimpanan. Fungsinya menjamin validitas integritas data tabel, menghemat ruang penyimpanan server, dan mempercepat pemrosesan kueri pencarian SQL.
Kapan pengembang harus memilih VARCHAR daripada TEXT?
Sebagai contoh, pengembang memilih VARCHAR saat panjang teks dapat terprediksi di bawah 255 hingga beberapa ratus karakter, seperti nama, email, atau judul. Kolom VARCHAR tersimpan langsung di baris data utama dan mendukung pengindeksan penuh secara cepat. Sebaliknya, tipe TEXT melayani naskah dokumen panjang yang tidak menuntut indeks unik di seluruh panjang teksnya.
Mengapa tipe data FLOAT tidak direkomendasikan untuk transaksi keuangan?
Faktanya, tipe data FLOAT menggunakan format pecahan aproksimasi biner yang rentan mengalami galat pembulatan desimal tak terduga. Untuk transaksi perbankan dan e-commerce, pengembang wajib menggunakan tipe DECIMAL (fixed-point) yang mempertahankan presisi nilai nominal uang secara mutlak hingga digit terkecil.
Apa perbedaan antara TIMESTAMP dan DATETIME di MySQL?
Sementara itu, perbedaan mendasar terletak pada penanganan zona waktu dan rentang tahun. TIMESTAMP otomatis mengonversi waktu ke UTC saat tersimpan dan memiliki batas akhir hingga tahun 2038 (keterbatasan 32-bit). Sebaliknya, DATETIME menyimpan angka kalender tetap tanpa penyesuaian zona waktu otomatis dan mampu mencatat waktu hingga tahun 9999.
Apakah MySQL mendukung tipe data dokumen NoSQL seperti JSON?
Bahkan, MySQL mendukung tipe data native JSON sejak versi 5.7 dan menyempurnakannya di versi 8.0. Tipe data ini memvalidasi dokumen secara otomatis, menyimpannya dalam format biner teroptimasi, serta mengizinkan ekstraksi nilai atribut secara langsung menggunakan operator penunjuk kueri inline.
Rangkuman dan Kesimpulan
Pada akhirnya, pemilihan tipe data yang cermat merupakan langkah paling fundamental dalam rekayasa perangkat lunak dan manajemen basis data relasional. Menguasai macam macam tipe data di MySQL membekali Anda kemampuan untuk membangun skema tabel yang tangguh, hemat sumber daya memori, dan siap menangani jutaan transaksi data secara simultan. Ingatlah untuk selalu memprioritaskan tipe data dengan alokasi memori terkecil yang aman guna menjamin skalabilitas aplikasi jangka panjang.
Guna memaksimalkan kinerja infrastruktur teknologi informasi Anda secara menyeluruh, lengkapi wawasan Anda dengan menyimak panduan konfigurasi perangkat keras di ulasan mengenal komputer server serta tata cara instalasi sistem operasi basis data di artikel mengenal Debian Linux.
Bermanfaat? Bagikan artikel ini ke grup WhatsApp Anda:
Bagikan ke WhatsApp