Setelah membahas tipe data string, kali ini penulis akan membahas kupas tuntas
tipe data numerik. Tipe data numerik pada MySQL sama seperti tipe data pada
bahasa pemrograman lainnya yakni untuk menyimpan nilai numerik (angka) dengan
jenis bilangan yang dapat disimpan adalah bilangan bulat positif dan negatif,
serta pecahan positif dan negatif baik dengan presisi tunggal maupun dengan
presisi ganda, untuk lebih lengkapnya lihat tabel berikut :
Tipe Data | Keterangan | Jangkauan | Ukuran |
---|---|---|---|
Tinyint | Menyimpan data bilangan bulat positif dan negatif | -128 s/d 127 atau 0 s/d 255 | 1 Byte |
Smallint | Menyimpan data bilangan bulat positif dan negatif | 32,768 s/d 32,767 atau 0 s/d 65535 | 2 Byte |
Mediumint | Menyimpan data bilangan bulat positif dan negatif | -8,388,608 s/d 8,388,607 atau 0 s/d 16,777,215 | 3 Byte |
Int | Menyimpan data bilangan bulat positif dan negatif | -2,147,483,648 s/d 2,147,483,647 atau 0 s/d 4,294,967,295 | 4 Byte |
Bigint | Menyimpan data bilangan bulat positif dan negatif | -9,223,372,036,854,775,808 s/d 9,223,372,036,854,775,807 atau 0 s/d 18,446,744,073,709,551,615 | 8 Byte |
1. Integer
Bentuk umum Format query tipe data integer mysql adalah sebagai berikut :
Int (M) | Unsigned | Zerofill
Tanda (M) merujuk pada length / panjang nilai untuk menampilkan data dimana
biasanya digunakan bersamaan dengan zerofill yaitu memberi angka 0 di kiri
data/nilai yang disimpan sebagai pengganti spasi, lebih jelasnya dapat melihat
contoh berikut:
create table intejer (kolom_1 int(5) zerofill, kolom_2 int zerofill)
0 row(s) affected, 3 warning(s): 1681 The ZEROFILL attribute is deprecated and will be removed in a future release. Use the LPAD function to zero-pad numbers, or store the formatted numbers in a CHAR column. 1681 Integer display width is deprecated and will be removed in a future release. 1681 The ZEROFILL attribute is deprecated and will be removed in a future release. Use the LPAD function to zero-pad numbers, or store the formatted numbers in a CHAR column. 0.109 sec
insert into intejer values (123788, 123788)
1 row(s) affected 0.031 sec
insert into intejer values (123, 123)
1 row(s) affected 0.016 sec
select * from intejer;
+---------+------------+
| kolom_1 | kolom_2 |
+---------+------------+
| 123788 | 0000123788 |
| 00123 | 0000000123 |
+---------+------------+
2 rows in set (0.00 sec)
Dapat dilihat perbedaannya pada kolom yang memiliki panjang nilai (kolom_1)
dengan kolom yang tidak memiliki panjang nilai (kolom_2) dimana pada kolom_1
memiliki panjang nilai sebanyak 5 sementara data dengan nilai 123 memiliki
nilai 0 di angka depannya akibat penggunaan zerofill namun pada nilai 123788
tidak memiliki angka 0 dikarenakan sudah melewati panjang nilai, sementara
pada kolom_2 memiliki angka 0 yang cukup banyak ini dikarenakan tidak memiliki
panjang nilai sehingga panjang nilai di set ke default yakni 10 digit. Selain
itu jika menggunakan zerofill kita tidak dapat menginput nilai negatif,
contohnya seperti berikut:
create table intejer (kolom_1 int(5) zerofill, kolom_2 int zerofill)
0 row(s) affected, 3 warning(s): 1681 The ZEROFILL attribute is deprecated and will be removed in a future release. Use the LPAD function to zero-pad numbers, or store the formatted numbers in a CHAR column. 1681 Integer display width is deprecated and will be removed in a future release. 1681 The ZEROFILL attribute is deprecated and will be removed in a future release. Use the LPAD function to zero-pad numbers, or store the formatted numbers in a CHAR column. 0.109 sec
insert into intejer values (123, -123)
Error Code: 1264. Out of range value for column 'kolom_2' at row 1 0.000 sec
Maka dalam hal ini semisal kita mendeklarasikan int(5), kita tetap dapat
menginput data berdasarkan jangkauan tipe datanya yakni -2,147,483,648 s/d 2,147,483,647 dengan jumlah digit maksimal 10 dan bukan
berarti 99999, selain itu, penggunaan dari length dan zerofill sudah
dianggap usang/kadaluarsa dan akan segera dihapus pada rilis
mendatang.
Penggunaan unsigned pada tipe data integer adalah untuk menjangkau nilai
positif yang lebih tinggi dengan mengorbankan nilai negatif, artinya angka
yang disimpan dimulai dari 0 s/d 4.294.483.647 dan tidak dapat menyimpan nilai
negatif, sedangkan jika dalam pendeklarasian tidak menggunakan unsigned maka
data yang dapat disimpan memiliki jangkauan dari -2.147.483.648 sampai
2.147.483.647, contohnya seperti berikut :
create table intejer (kolom_1 int unsigned, kolom_2 int)
0 row(s) affected 0.281 sec
insert into intejer values (0, -2147483648)
1 row(s) affected 0.062 sec
insert into intejer values (-1, -2147483648)
Error Code: 1264. Out of range value for column 'kolom_1' at row 1 0.000 sec
Dapat dilihat pada kolom kolom_1 yang menggunakan tanda unsigned dapat
menyimpan nilai 0, namun tidak dapat menyimpan nilai negatif meski itu -1
sehingga menampilkan pesan error code 1264 yang berarti nilai yang di insert
diluar jangkauan. Dengan tipe data integer kita tidak dapat menyimpan nilai
pecahan, yaitu nilai dibelakang koma, kalau kita tetap menggunakan integer
maka akan terlihat seperti berikut :
insert into intejer values (2147.483647, 2983)
1 row(s) affected 0.046 sec
mysql> select * from intejer;
+---------+---------+
| kolom_1 | kolom_2 |
+---------+---------+
| 2147 | 2983 |
+---------+---------+
1 row in set (0.00 sec)
Dapat dilihat nilai yang disimpan hanya nilai yang berada di depan titik
saja sementara nilai yang ada dibelakangnya diabaikan / tidak disimpan,
untuk mengatasi hal ini mysql menyediakan tipe data fixed point (decimal)
untuk menyimpan nilai bilangan pecahan.
2. Fixed Point
Format query untuk tipe data desimal
Decimal (M, D) | Unsigned | Zerofill
Pada penggunaan tipe data pecahan desimal M adalah jumlah digit keseluruhan
atau dikenal sebagai nilai presisi, dan D adalah jumlah digit dibelakang
koma dimana nilai maksimal M adalah 65 dan nilai D 30 dengan catatan nilai D
tidak lebih besar dari nilai M, contohnya seperti berikut :
create table pecahan (kolom_1 decimal, kolom_2 decimal (2, 4))
Error Code: 1427. For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 'kolom_2'). 0.000 sec
Dapat dilihat pada kolom_2 dengan nilai D lebih besar dari M maka
menampilkan error code 1427 yang berarti M harus >= D, selain itu jika
kita tidak menyertakan M dan D seperti pada kolom_1 saat pendeklarasian
maka secara default akan di set (10, 0), sehingga contoh yang benar adalah
sebagai berikut:
create table pecahan (kolom_1 decimal, kolom_2 decimal (8, 6))
0 row(s) affected 0.203 sec
Pada kolom_2 dari contoh diatas menunjukkan kita dapat menyimpan 8 digit
angka, dengan 2 digit di depan koma dan 6 dibelakang koma sehingga nilai
maksimal yang dapat di input adalah -99.999999 s/d 99.999999, kita juga
tidak dapat menambah angka didepan koma meskipun dengan mengurangi digit
dibelakang koma seperti contoh berikut:
insert into pecahan values (11, 99.99999)
1 row(s) affected 0.015 sec
insert into pecahan values (11, 999.9999)
Error Code: 1264. Out of range value for column 'kolom_2' at row 1 0.000 sec
Salah satu karakteristik tipe data desimal pada mysql adalah tidak bisa
menyimpan nilai desimal yang diawali dengan angka 0 seperti contoh berikut
ini:
create table desimal (kolom_1 decimal(5,1)); Query OK, 0 rows affected (0.46 sec) insert into desimal values (0003.1); Query OK, 1 row affected (0.23 sec) select * from desimal; +---------+ | kolom_1 | +---------+ | 3.1 | +---------+ 1 row in set (0.00 sec)
Maka nilai yang disimpan hanya nilai selain 0 saja, meskipun dengan
kombinasi angka 0 berada di tengah semisal 0102.2 akan menjadi 12.2. Lalu bagaimana kalau
jadinya seperti berikut ini:
create table desimal (kolom_1 decimal(2,2), kolom_2 decimal(2,2))
0 row(s) affected 0.218 sec
Kira-kira berapa nilai minimum dan maksimum yang dapat dijangkau? -9.99?
9.99? Jawabannya salah. Kok bisa? Bukannya M disana 2 menandakan 2 digit?
Ya benar, maksimal angka yang dapat disimpan adalah 2 digit namun angka
dibelakang koma merupakan nila fixed (tetap) sehingga nilai dibelakang
koma lebih diutamakan, maka jadinya seperti berikut:
insert into desimal values (-0.99, 0.99) 1 row(s) affected 0.203 sec insert into desimal values (-1.99, 1.99) Error Code: 1264. Out of range value for column 'kolom_1' at row 1 0.000 sec insert into desimal values (-1.00, 1.00) Error Code: 1264. Out of range value for column 'kolom_1' at row 1 0.000 sec
Dapat dilihat ketika mencoba menginput nilai -1.99 s/d 1.99 bahkan 1.00
justru menampilkan error, hal tersebut dikarenakan tipe data desimal pada
mysql disimpan dalam format biner yang mengelompokan sembilan digit
desimal menjadi 4 byte seperti pada tabel berikut:
Sisa Digit | Jumlah Memori |
0 | 0 byte |
1-2 | 1 byte |
3-4 | 2 byte |
5-6 | 3 byte |
7-9 | 4 byte |
Maka dari contoh diatas sisa digitnya adalah 0 disimpan dengan jumlah memori 0 bytes sehingga
angka 0 dapat disimpan. Jadi jika kalian mendefinisikan tabel di awal (5,2) maka sisa digitnya adalah 3 sedangkan 2 digitnya di alokasikan untuk angka dibelakang koma namun kalian tidak dapat menyimpan nilai yang diawali dengan 0 pada tipe data desimal selama sisa digit masih tersedia. Sama seperti integer, tipe data decimal juga dapat
menggunakan unsigned dan zerofill, biasanya tipe data decimal digunakan
untuk menyimpan nilai yang bersifat keuangan.
Untuk mempelajari pembahasan lainnya silahkan lihat halaman daftar isi.