Konversi Tipe String dan Numerik MySQL: CAST vs CONVERT Dijelaskan dengan Contoh Praktis

目次

1. Pendahuluan

Saat mengoperasikan basis data dengan MySQL, Anda sering menemui situasi seperti “data yang seharusnya diperlakukan sebagai angka disimpan sebagai tipe string” atau “perhitungan dan agregasi tidak dapat dilakukan sementara data tetap berupa string.” Misalnya, data yang diimpor dari file Excel atau CSV sering disimpan sebagai VARCHAR atau CHAR, meskipun sebenarnya mewakili nilai numerik. Dalam kasus seperti itu, operasi seperti penjumlahan, rata‑rata, dan perbandingan numerik mungkin tidak berfungsi sebagaimana mestinya, sehingga sulit menulis kueri SQL yang tepat.

Di sisi lain, ada skenario di mana data numerik perlu diperlakukan sebagai string. Contohnya, ketika menambahkan nol di depan ID atau kode, atau ketika menggabungkan data numerik dengan kolom lain untuk tujuan tampilan. Dalam situasi tersebut, mengonversi tipe numerik ke tipe string menjadi diperlukan.

Dengan cara ini, “konversi tipe antara string dan angka” adalah salah satu keterampilan dasar yang diperlukan untuk memanipulasi data secara fleksibel di MySQL. Dengan menggunakan konversi tipe secara tepat, Anda dapat menjaga integritas data sekaligus memungkinkan agregasi dan pemrosesan yang fleksibel.

Dalam artikel ini, kami akan menjelaskan secara jelas cara mengonversi antara string dan angka di MySQL, cara menggunakan teknik ini secara efektif, serta jebakan umum dan praktik terbaik berdasarkan pengalaman dunia nyata. Baik Anda pemula maupun pengembang SQL berpengalaman, panduan ini akan memberikan nilai praktis.

2. Jenis Konversi Tipe di MySQL

MySQL menyediakan beberapa fitur praktis untuk mengonversi tipe data. Pada bagian ini, kami akan menjelaskan dua pola utama: “konversi tipe eksplisit” dan “konversi tipe implisit,” beserta metode representatifnya.

2.1 Konversi Tipe Eksplisit

Konversi tipe eksplisit berarti secara jelas menyatakan dalam SQL bahwa “nilai ini harus dikonversi ke tipe tertentu.” Dua fungsi berikut ini paling umum digunakan.

Fungsi CAST
CAST() adalah fungsi SQL standar yang mengonversi nilai ke tipe yang ditentukan. Fungsi ini banyak dipakai di MySQL.

SELECT CAST('123' AS SIGNED);

Pada contoh ini, string '123' dikonversi menjadi integer bertanda (SIGNED). Tipe lain yang dapat dikonversi meliputi UNSIGNED (integer tak bertanda), DECIMAL (angka titik tetap), CHAR (string), dan DATE (tanggal).

Fungsi CONVERT
CONVERT() adalah fungsi lain yang digunakan untuk mengonversi nilai ke tipe data yang berbeda. Sintaksnya sebagai berikut.

SELECT CONVERT('456', UNSIGNED);

Pada contoh ini, string '456' dikonversi menjadi integer tak bertanda (UNSIGNED). Perbedaan utama dengan CAST() adalah bahwa CONVERT() juga dapat digunakan untuk konversi set karakter.

2.2 Konversi Tipe Implisit

Konversi tipe implisit adalah mekanisme di mana MySQL secara otomatis mengonversi tipe data saat melakukan operasi atau perbandingan.

Misalnya, ketika menambahkan angka dan string, MySQL otomatis mengonversi string menjadi nilai numerik.

SELECT 1 + '2';
-- Result: 3

Demikian pula, ketika menggabungkan nilai numerik sebagai string:

SELECT CONCAT(10, ' apples');
-- Result: '10 apples'

Konversi tipe implisit memang nyaman, tetapi dapat menghasilkan hasil yang tidak diinginkan. Oleh karena itu, untuk logika yang kompleks atau proses kritis, penggunaan konversi tipe eksplisit sangat disarankan.

3. Contoh Praktis: Mengonversi String ke Angka

Di MySQL, ketika nilai numerik disimpan sebagai string (seperti CHAR atau VARCHAR), Anda tidak dapat secara andal melakukan perhitungan atau perbandingan numerik sebagaimana adanya. Untuk mengagregasi dan menganalisis data tersebut dengan benar, Anda perlu mengonversi string menjadi tipe numerik. Bagian ini memperkenalkan metode konversi yang umum digunakan serta hal‑hal penting yang perlu diperhatikan.

3.1 Mengonversi dengan Fungsi CAST

Pendekatan paling dasar adalah menggunakan fungsi CAST(). Misalnya, untuk mengonversi string '100' menjadi integer, tulis kode berikut:

SELECT CAST('100' AS SIGNED) AS numeric_result;
-- Result: 100 (integer)

Gunakan SIGNED untuk bilangan bulat bertanda dan UNSIGNED untuk bilangan bulat tak bertanda. Untuk data desimal, Anda dapat menggunakan DECIMAL atau FLOAT juga.

SELECT CAST('123.45' AS DECIMAL(10,2)) AS decimal_result;
-- Result: 123.45

3.2 Mengonversi dengan Fungsi CONVERT

Fungsi CONVERT() dapat digunakan dengan cara yang hampir sama:

SELECT CONVERT('200', SIGNED) AS converted_result;
-- Result: 200

Keduanya menghasilkan hasil yang sama, tetapi karena CAST() adalah SQL standar dan menawarkan portabilitas yang lebih baik, biasanya direkomendasikan ketika ragu.

3.3 Konversi Implisit melalui Aritmetika

Ketika Anda melakukan operasi aritmetika dengan tipe numerik dan string dalam ekspresi SQL, MySQL secara otomatis mengonversi string menjadi angka. Misalnya:

SELECT '50' + 25 AS total;
-- Result: 75

Anda juga dapat menerapkan perilaku ini pada fungsi agregasi. Misalnya, jika Anda mengirimkan kolom bertipe string ke SUM(), MySQL secara otomatis mencoba konversi numerik dan menjumlahkan nilai-nilainya:

SELECT SUM(amount) FROM sales_data;
-- Even if the amount column is VARCHAR, MySQL will attempt numeric summation

3.4 Waspadai String Berisi Nol di Depan dan Nilai Non-Numerik

String yang dipenuhi nol di depan (misalnya, '000100') juga dapat dikonversi menjadi angka:

SELECT CAST('000100' AS SIGNED) AS converted_result;
-- Result: 100

Namun, berhati-hatilah jika string mengandung karakter non-numerik. Jika Anda mengonversi sesuatu seperti CAST('abc123' AS SIGNED), dan tidak ada karakter numerik di awal, MySQL mengembalikan 0. Tergantung pada kualitas data, penting untuk melakukan validasi input sebelum konversi.

3.5 Contoh Kasus Penggunaan Nyata Umum

  • Mengagregasi data penjualan atau jumlah yang menjadi string karena impor Excel/CSV
  • Mengurutkan ID yang disimpan sebagai string (meskipun mewakili angka) dalam urutan numerik
  • Mengurutkan string tanggal yang disimpan dalam format YYYYMMDD berdasarkan urutan tanggal (akan dijelaskan nanti)

4. Contoh Praktis: Mengonversi Angka menjadi String

Di MySQL, ada banyak kasus di mana Anda ingin memperlakukan data numerik sebagai string. Contoh tipikal meliputi menampilkan ID atau kode dengan padding nol, atau membuat pesan dengan menggabungkan nilai numerik dengan teks lain. Bagian ini memperkenalkan metode representatif dan contoh penggunaan praktis.

4.1 Mengonversi dengan Fungsi CAST

Untuk secara eksplisit mengonversi tipe numerik (seperti INT atau DECIMAL) menjadi tipe string, gunakan CAST():

SELECT CAST(123 AS CHAR) AS string_result;
-- Result: '123'

Dengan metode ini, Anda dapat dengan mudah menggabungkan kolom numerik dengan string lain.

4.2 Mengonversi dengan Fungsi CONVERT

Anda juga dapat melakukan hal yang sama dengan CONVERT():

SELECT CONVERT(456, CHAR) AS converted_result;
-- Result: '456'

Perbedaannya sedikit dibandingkan CAST(), tetapi dari perspektif SQL standar, CAST() sedikit lebih disukai.

4.3 Konversi Implisit melalui Penggabungan

Saat menggabungkan angka dan string menggunakan fungsi seperti CONCAT(), MySQL secara otomatis mengonversi angka menjadi string.

SELECT CONCAT(2024, ' year') AS fiscal_year_display;
-- Result: '2024 year'

Konversi implisit seperti ini biasanya digunakan untuk output pelaporan rutin dan pemformatan data.

4.4 Contoh Kasus Penggunaan Nyata Umum

  • Membuat ID berisi nol di depan Untuk menampilkan ID numerik dalam 5 digit, gabungkan dengan LPAD() sebagai berikut: SELECT LPAD(CAST(id AS CHAR), 5, '0') AS zero_padded_id FROM users; -- Jika id=7, hasilnya adalah '00007'
  • Menggabungkan tanggal atau jumlah menjadi string SELECT CONCAT('The total amount is ', CAST(total AS CHAR), ' yen.') AS message FROM orders; -- Jika total=1500, hasilnya adalah 'The total amount is 1500 yen.'

4.5 Catatan

Bahkan jika string yang dikonversi terlihat sama secara visual, perilaku “pengurutan” dan “operasi perbandingan” berubah. Misalnya, ketika mengurutkan sebagai string, '20' dapat muncul sebelum '100' (urutan leksikografis). Penting untuk memilih pendekatan tergantung pada tujuan Anda.

5. Kasus Penggunaan Lanjutan dengan Konversi Tipe

Konversi tipe tidak terbatas pada transformasi numerik atau string sederhana. Itu juga dapat diterapkan dalam berbagai skenario praktis di sistem dunia nyata. Bagian ini memperkenalkan kasus lanjutan yang umum digunakan serta pertimbangan kunci mereka.

5.1 Membandingkan dan Mengonversi String Mirip Tanggal

Jika basis data Anda menyimpan tanggal dalam format seperti YYYYMMDD sebagai tipe numerik atau string, perbandingan string sederhana mungkin tidak selalu berperilaku seperti yang diharapkan.

Dalam kasus seperti itu, mengonversi nilai ke tipe numerik menggunakan CAST() memungkinkan pengurutan dan perbandingan kronologis yang tepat.

SELECT *
FROM events
ORDER BY CAST(event_date AS UNSIGNED);
-- Values such as '20240501', '20240502', etc. are sorted in date order

Anda juga dapat menggabungkannya dengan fungsi REPLACE() untuk mengonversi tanggal yang dipisahkan tanda hubung seperti '2024-05-01' menjadi bilangan bulat.

SELECT CAST(REPLACE('2024-05-01', '-', '') AS UNSIGNED);
-- Result: 20240501

5.2 Mengurutkan Tipe ENUM atau Nilai Kode Secara Numerik

Untuk tipe ENUM atau nilai kode yang mewakili makna numerik, Anda mungkin ingin mengurutkannya dalam urutan numerik bukan urutan leksikografis. Dengan mengonversinya ke tipe numerik menggunakan CAST() sebelum pengurutan, Anda memperoleh urutan yang intuitif.

SELECT *
FROM products
ORDER BY CAST(product_code AS UNSIGNED);

5.3 Penggunaan dalam Agregasi dan Pemformatan Data

Misalnya, jika jumlah penjualan disimpan sebagai VARCHAR, Anda dapat memperoleh total yang akurat dengan mengonversinya secara eksplisit di dalam SUM().

SELECT SUM(CAST(sales_amount AS SIGNED)) AS total_sales
FROM sales_data;

5.4 Mencegah Masalah dengan Presisi dan Pemilihan Tipe

Untuk nilai desimal atau numerik besar, mengonversi ke tipe DECIMAL membantu mempertahankan presisi.

Memilih antara SIGNED dan UNSIGNED juga penting, tergantung apakah nilai negatif dapat ada dalam data Anda.

SELECT CAST('1234.567' AS DECIMAL(10, 3));
-- Result: 1234.567

5.5 Mendeteksi Kesalahan atau Data Tidak Valid

Jika konversi menghasilkan nilai NULL atau 0 yang tidak terduga, hal ini dapat menunjukkan data tidak valid.

Misalnya, jika sebuah string tidak dapat dikonversi menjadi angka, CAST() dapat mengembalikan 0 atau NULL tergantung pada mode SQL.

Dalam kasus seperti itu, memeriksa hasil konversi dapat membantu mengidentifikasi kebutuhan pembersihan atau validasi data.

SELECT original, CAST(original AS SIGNED) AS converted
FROM test_data
WHERE CAST(original AS SIGNED) = 0 AND original <> '0';
-- Extract only data that cannot be properly converted to numeric values

6. Perbedaan Antara CAST dan CONVERT

Saat melakukan konversi tipe di MySQL, Anda biasanya menggunakan fungsi CAST atau fungsi CONVERT. Meskipun keduanya tampak serupa, ada perbedaan dalam penggunaan dan karakteristiknya. Bagian ini menjelaskan perbedaan tersebut dan cara memilih di antara keduanya.

6.1 Perbedaan Dasar

  • Fungsi CAST Menggunakan sintaks CAST(value AS type) untuk secara eksplisit mengonversi nilai ke tipe yang ditentukan. Fungsi ini didefinisikan dalam SQL standar dan berfungsi serupa di banyak sistem basis data. SELECT CAST('123' AS SIGNED);
  • Fungsi CONVERT Menggunakan sintaks CONVERT(value, type) untuk mengonversi nilai ke tipe yang ditentukan. Di MySQL, fungsi ini juga dapat digunakan untuk konversi set karakter. SELECT CONVERT('123', SIGNED); -- Konversi tipe SELECT CONVERT('hello' USING utf8mb4); -- Konversi set karakter

6.2 Kompatibilitas dengan SQL Standar

Karena CAST merupakan bagian dari standar SQL internasional, ia menawarkan portabilitas yang lebih baik ke basis data lain (seperti PostgreSQL, SQL Server, dan Oracle). Di sisi lain, CONVERT mencakup ekstensi khusus MySQL, terutama untuk konversi set karakter, dengan menggunakan sintaks seperti CONVERT(expr USING charset_name).

6.3 Cara Memilih Di Antara Keduanya

  • Untuk konversi tipe (angka, string, tanggal, dll.) Dalam kebanyakan kasus, menggunakan CAST adalah pilihan paling aman. Ini adalah SQL standar, sangat portabel, dan cocok untuk migrasi basis data di masa depan.
  • Untuk konversi set karakter (mis., sjis ke utf8mb4) Anda harus menggunakan CONVERT(expr USING charset_name) .
  • Untuk kasus khusus MySQL atau khusus CONVERT dapat menawarkan fleksibilitas tambahan, tetapi untuk keperluan umum, mulailah dengan CAST dan hanya gunakan CONVERT bila diperlukan.

6.4 Contoh Perbandingan

-- Type conversion using CAST (convert to integer)
SELECT CAST('456' AS SIGNED);

-- Type conversion using CONVERT
SELECT CONVERT('456', SIGNED);

-- Character set conversion using CONVERT
SELECT CONVERT('Hello' USING utf8mb4);

6.5 Catatan Penting

  • Jika konversi gagal, kedua fungsi dapat mengembalikan NULL atau 0 .
  • Konversi set karakter tidak dapat dilakukan dengan CAST .
  • Perilaku dapat berbeda tergantung pada mode SQL atau versi MySQL, jadi selalu uji di lingkungan pengembangan dan produksi.

7. Catatan Penting dan Praktik Terbaik

Saat menggunakan konversi tipe string dan numerik di MySQL, ada beberapa jebakan potensial yang perlu diwaspadai. Bagian ini memperkenalkan praktik terbaik untuk membantu mencegah masalah dan memastikan penggunaan yang aman serta akurat.

7.1 Kesalahan atau NULL/0 Tak Terduga dari Konversi Tidak Valid

Saat melakukan konversi tipe, jika nilai sumber tidak dalam format yang benar, MySQL dapat mengembalikan nilai NULL atau 0 yang tidak terduga.

SELECT CAST('abc' AS SIGNED) AS result;
-- Result: 0 (default MySQL behavior)

Seperti yang ditunjukkan di atas, mengonversi string non-numerik menjadi tipe numerik menghasilkan 0. Oleh karena itu, selalu pastikan bahwa data asli tidak mengandung nilai tidak valid sebelum konversi.

Tergantung pada pengaturan mode SQL, konversi dapat menghasilkan error atau NULL. Selalu konfirmasikan konfigurasi lingkungan produksi Anda.

7.2 Memilih Presisi dan Tipe Signed/Unsigned

  • Untuk nilai yang mengandung desimal, konversikan ke DECIMAL atau FLOAT
  • Jika nilai negatif memungkinkan, gunakan SIGNED; jika nilai hanya berupa bilangan bulat positif, gunakan UNSIGNED

Selalu pilih tipe yang sesuai berdasarkan karakteristik data Anda.

7.3 Dampak pada Indeks

Menggunakan fungsi konversi tipe seperti CAST atau CONVERT dalam klausa WHERE atau ORDER BY dapat mencegah penggunaan indeks, yang mengakibatkan penurunan kinerja.

SELECT * FROM users WHERE CAST(user_id AS SIGNED) = 1000;
-- Even if user_id has an index, it is often not used

Untuk dataset besar atau kueri yang kritis terhadap kinerja, sebaiknya seragamkan tipe kolom dalam desain skema untuk menghindari konversi yang tidak perlu.

7.4 Jangan Terlalu Mengandalkan Konversi Implisit

Konversi tipe implisit di MySQL memang nyaman, tetapi dapat menyebabkan perilaku yang tidak diinginkan. Untuk logika penting, selalu gunakan CAST atau CONVERT secara eksplisit.

SELECT '100a' + 20;
-- Result: 100 (only the leading numeric portion is used)

Untuk menghindari bug halus dan inkonsistensi data, jadikan konversi eksplisit sebagai kebiasaan.

7.5 Validasi Tipe pada Tahap Input Data

Saat merancang basis data Anda, simpan data numerik sebagai tipe numerik dan data string sebagai tipe string. Meminimalkan kebutuhan konversi melalui desain skema yang tepat adalah salah satu cara paling efektif untuk mencegah masalah.

8. Ringkasan

Konversi tipe antara string dan angka di MySQL adalah topik yang tak terhindarkan dalam pemrosesan data harian, agregasi, dan operasi sistem. Dalam artikel ini, kami membahas segala hal mulai dari penggunaan dasar hingga teknik lanjutan dan langkah-langkah pencegahan penting.

Untuk konversi string-ke-angka, metode eksplisit seperti CAST dan CONVERT tersedia. Meskipun konversi implisit sering digunakan dalam praktik, memprioritaskan konversi eksplisit meningkatkan keandalan dan kualitas data. Sebaliknya, konversi angka-ke-string juga banyak digunakan untuk memformat ID, kode, dan menghasilkan pesan output.

Selain itu, teknik seperti aplikasi terkait tanggal, agregasi dan pengurutan, serta deteksi kesalahan menunjukkan betapa kuatnya konversi tipe dalam skenario dunia nyata. Namun, konversi juga memiliki potensi jebakan dan dampak kinerja. Selalu ikuti praktik terbaik yang dibahas di atas.

Dengan menguasai konversi tipe dengan tepat, Anda dapat secara signifikan memperluas kemampuan Anda dalam memanipulasi data secara efektif di MySQL.
Kami berharap artikel ini mendukung pekerjaan dan pembelajaran harian Anda.

9. FAQ (Pertanyaan yang Sering Diajukan)

Q1. Apa yang terjadi jika saya CAST string seperti ‘abc’ menjadi angka?

Di MySQL, ketika mencoba mengonversi string menjadi tipe numerik (seperti SIGNED atau UNSIGNED), MySQL mengembalikan bagian numerik di awal jika ada; jika tidak, ia mengembalikan 0.

SELECT CAST('abc' AS SIGNED); -- Result: 0
SELECT CAST('123abc' AS SIGNED); -- Result: 123

Namun, tergantung pada mode SQL (misalnya, STRICT_TRANS_TABLES), hasilnya dapat berupa error atau NULL.

Q2. Haruskah saya menggunakan CAST atau CONVERT?

Untuk konversi tipe umum (angka, string, tanggal, dll.), menggunakan CAST disarankan karena sesuai dengan standar SQL. Untuk konversi set karakter, Anda harus menggunakan fungsi CONVERT dengan klausa USING. Pilih berdasarkan kasus penggunaan Anda.

Q3. Apakah konversi tipe implisit sudah cukup?

Konversi implisit mungkin berfungsi untuk kueri kecil atau pengujian, tetapi untuk agregasi kritis dan pengembangan sistem produksi, konversi eksplisit (CAST atau CONVERT) sangat disarankan. Menulis konversi eksplisit membantu mencegah perilaku tak terduga dan bug.

Q4. Apakah penggunaan konversi tipe di WHERE atau ORDER BY menonaktifkan indeks?

Ya. Menerapkan fungsi seperti CAST atau CONVERT pada sebuah kolom dapat mencegah MySQL menggunakan indeks yang didefinisikan pada kolom tersebut.
Jika diperlukan kueri dengan kinerja tinggi pada dataset besar, samakan tipe kolom sebelumnya atau pertimbangkan menggunakan subkueri atau kolom yang dihasilkan.

Q5. Apakah konversi tipe aman untuk desimal atau angka besar?

Menggunakan DECIMAL atau FLOAT dapat mempertahankan presisi, tetapi kesalahan pembulatan, kehilangan presisi, atau pemotongan masih dapat terjadi. Selalu tentukan presisi dan skala yang cukup untuk kebutuhan Anda.

Q6. Apa perbedaan antara mengurutkan sebagai string dan mengurutkan sebagai angka?

Saat diurutkan sebagai string, nilai seperti '10' dapat muncul sebelum '2' karena urutan leksikografis. Jika Anda menginginkan urutan numerik, selalu lakukan konversi tipe sebelum mengurutkan.