Wednesday, October 30, 2013

Tipe Data 'Decimal' di SQL Server

Di SQL Server banyak yang menganggap remeh tipe data decimal. Remeh disini bukan berarti underestimate tetapi lebih tidak memahami konsepnya secara jelas. Seperti halnya yang telah saya lakukan, hihihi.

Ceritanya begini, waktu itu saya mengubah tipe data decimal(20,2) menjadi decimal(20,15). Awalnya saya mengira bahwa 20 adalah jumlah bilangan di depan koma dan 2 adalah 15 jumlah bilangan di belakan koma. Jadi tidak ada masalah ketika saya menginginkan jumlah koma yang lebih banyak untuk menambah presisi dari data.

Namun kenyataanya tidak begitu. Ketika saya memasukkan data kembali muncul error "System.Data.SqlClient.SqlException (0x80131904): Arithmetic overflow error converting numeric to data type numeric. The statement has been terminated.". Saya bingung kenapa bisa muncul error tersebut. Setelah 1 jam mencari root cause dari masalah tersebut saya kemudian menyadari satu hal, saya telah salah dalam memahami konsep decimal.



Memang bahwa decimal(20,2) dan decimal(20,15) adalah tipe data yang berbeda. Tapi ada satu hal yang sangat penting dari itu, yaitu masalah jumlah data yang dapat ditampung dari tipe data tersebut. Jadi decimal(20,15) itu artinya adalah bahwa 15 digit belakang koma yang diijinkan untuk ditampung. Nah masalahnya adalah apa arti angka 20 dalam decimal(20,15) tersebut. Ternyata 20 adalah jumlah digit yang boleh ditampung dalam variabel yang memiliki tipe tersebut.

Ya, jumlah keseluruhan digit yang boleh ditampung. Jadi total digit yang boleh ditampung adalah 20 digit, itu artinya jika 15 digit sudah dipesan untuk mengisi bilangan di belakang koma maka untuk di depan koma berarti hanya diperbolehkan 20 - 15 = 5 digit aja.

Nah masalah yang timbul adalah jika jumlah digit melebihi 5 (yang diperbolehkan) maka proses akan error. Berbeda dengan jika bilangan di belakang koma lebih dari 15 digit maka otomatis akan disimpan ke 15 digit di belakang koma tanpa error.

Solusi dari masalah tersebut kemudian saya memperbesar nilai dari 20 menjadi 35 (maksimal 38) untuk meningkatkan daya tampung bilangan ~ yang mungkin berimplikasi terhadap ukuran database menjadi lebih besar.

No comments:

Post a Comment