Pengantar
Salah satu fitur utama dari database relasional secara umum adalah kemampuan untuk mendefinisikan skema atau struktur tabel yang secara tepat menentukan format data yang akan dikandungnya. Ini dilakukan dengan menentukan kolom yang berisi struktur ini bersama dengan tipe data their dan batasan apa pun.
Tipe data menentukan pola umum untuk data yang mereka terima dan simpan. Nilai harus mematuhi persyaratan yang digariskan agar dapat diterima oleh MySQL. Meskipun dimungkinkan untuk menentukan persyaratan khusus, tipe data menyediakan blok bangunan dasar yang memungkinkan MySQL untuk memvalidasi input dan bekerja dengan data menggunakan operasi yang sesuai.
MySQL mencakup berbagai tipe data yang digunakan untuk memberi label dan memvalidasi nilai yang sesuai dengan tipe yang sesuai. Dalam panduan ini, kita akan membahas tipe data paling umum yang tersedia di MySQL, berbagai format input dan output yang mereka gunakan, dan cara mengonfigurasi berbagai bidang untuk memenuhi kebutuhan aplikasi Anda.
Apa saja tipe data di MySQL?
Sebelum masuk ke detail, mari kita lihat secara luas tipe data apa yang disediakan MySQL.
MySQL mendukung berbagai jenis data yang sesuai untuk berbagai jenis data sederhana dan kompleks. Ini termasuk:
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
DECIMAL
NUMERIC
FLOAT
DOUBLE
BIT
DATE
DATETIME
TIMESTAMP
TIME
YEAR
CHAR
VARCHAR
BINARY
VARBINARY
BLOB
TEXT
ENUM
SET
GEOMETRY
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
JSON
Kami akan membahas yang paling umum dari ini secara lebih mendalam di seluruh panduan ini.
Memulai tipe data MySQL
Saat Anda memulai dengan tipe, penting untuk diingat bahwa tipe saja tidak selalu merupakan solusi lengkap untuk validasi data, tetapi sebuah komponen. Alat database lainnya, seperti kendala juga memiliki peran dalam menentukan kebenaran. Namun, tipe data sering kali menjadi garis pertahanan pertama terhadap data yang tidak valid.
Untuk banyak kasus, tipe umum yang disediakan oleh MySQL sesuai untuk jenis data yang akan Anda simpan. Misalnya, sementara Anda dapat menyimpan koordinat titik geometris dalam dua kolom angka yang berbeda, point
yang disediakan type adalah tujuan yang dibangun untuk menyimpan dan memvalidasi persis jenis informasi ini. Saat memilih jenis, periksa untuk melihat apakah Anda menggunakan jenis paling spesifik yang berlaku untuk kasus penggunaan Anda.
Angka dan nilai numerik
MySQL mencakup berbagai tipe data numerik yang cocok untuk skenario yang berbeda. Jenis yang sesuai bergantung pada sifat pasti dari nilai yang Anda rencanakan untuk disimpan serta persyaratan presisi Anda.
Bilangan bulat
bilangan bulat tipe data adalah kategori tipe yang digunakan untuk menyimpan angka tanpa pecahan atau desimal. Ini dapat berupa nilai positif atau negatif, dan tipe bilangan bulat yang berbeda dapat menyimpan rentang angka yang berbeda. Jenis bilangan bulat dengan rentang nilai yang dapat diterima lebih kecil membutuhkan lebih sedikit ruang daripada jenis dengan rentang yang lebih luas.
Daftar dasar tipe integer meliputi:
Jenis bilangan bulat | Panjang | Rentang bertanda tangan yang berlaku | Rentang tidak bertanda tangan yang berlaku |
---|---|---|---|
TINYINT | 1 byte | -128 hingga 127 | 0 hingga 255 |
SMALLINT | 2 byte | -32768 hingga 32767 | 0 hingga 65535 |
MEDIUMINT | 3 byte | -8388608 hingga 8388607 | 0 hingga 16777215 |
INT | 4 byte | -2147483648 hingga 2147483647 | 0 hingga 4294967295 |
BIGINT | 8 byte | -2^63 hingga -2^63-1 | 0 hingga 2^64-1 |
Jenis di atas dibatasi oleh rentang validnya. Nilai apa pun di luar rentang akan menghasilkan kesalahan.
Selain tipe yang disebutkan di atas, MySQL juga mengenali alias yang disebut SERIAL
. Menandai kolom sebagai SERIAL
akan memberikan properti ini:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Ini digunakan sebagai singkatan untuk properti kolom kunci utama umum. Kolom akan secara otomatis menetapkan nilai unik baru setiap kali catatan ditambahkan.
Titik tetap
Jenis titik tetap digunakan untuk mengontrol jumlah presisi atau spesifisitas mungkin untuk nomor dengan desimal. Di MySQL, ini dapat dikontrol dengan memanipulasi dua faktor:presisi dan skala.
Presisi adalah jumlah maksimum total digit yang dapat dimiliki suatu bilangan. Sebaliknya, skala adalah jumlah digit di sebelah kanan titik desimal. Dengan memanipulasi angka-angka ini, Anda dapat mengontrol seberapa besar komponen pecahan dan non-fraksional dari suatu angka yang diizinkan.
Kedua argumen ini digunakan untuk mengontrol presisi arbitrer menggunakan numeric
atau decimal
tipe data (kedua tipe ini identik di MySQL). numeric
type membutuhkan nol hingga dua argumen.
Tanpa argumen, kolom didefinisikan memiliki presisi 10 dan skala 0. Ini berarti kolom dapat menampung hingga 10 digit, tetapi tidak satu pun dari angka ini yang dapat berada setelah titik desimal:
NUMERIC
Ketika satu argumen diberikan, itu ditafsirkan sebagai ketepatan kolom dengan skala yang disetel ke 0. Ini secara efektif memungkinkan Anda untuk menentukan jumlah digit maksimum dalam bilangan seperti bilangan bulat (tanpa komponen pecahan atau desimal). Misalnya, jika Anda membutuhkan 5 digit bilangan bulat, Anda dapat menentukan:
NUMERIC(5)
Tentukan presisi diikuti dengan skala saat mengonfigurasi kolom menggunakan kedua kontrol. MySQL akan membulatkan komponen desimal dari input apa pun ke jumlah digit yang benar menggunakan nomor skala. MySQL akan menggunakan presisi dan skala untuk menentukan berapa banyak digit yang diperbolehkan di sisi kiri titik desimal. Jika entri melebihi jumlah digit yang diizinkan, MySQL akan menghasilkan kesalahan.
Misalnya, kita dapat menentukan kolom dengan presisi total 5 dan skala 2:
NUMERIC(5, 2)
Kolom ini akan memiliki perilaku berikut:
Nilai masukan | Nilai yang dibulatkan | Diterima (sesuai presisi)? |
---|---|---|
400.28080 | 400.28 | Ya |
8.332799 | 8,33 | Ya |
11799.799 | 11799.80 | Tidak |
11799 | 11799 | Tidak |
2802.27 | 2802.27 | Tidak |
Titik mengambang
Angka floating point adalah cara lain untuk mengekspresikan angka desimal, tetapi tanpa presisi yang tepat dan konsisten. Sebaliknya, tipe floating point hanya memiliki konsep presisi maksimum yang sering dikaitkan dengan arsitektur dan platform perangkat keras.
Misalnya, untuk membatasi kolom floating point hingga 8 digit presisi, Anda dapat menggunakan FLOAT
type, yang menyimpan hasil menggunakan 4 byte dengan presisi mulai dari 0 hingga 23 digit:
FLOAT(8)
Demikian pula, DOUBLE
type menggunakan 8 byte untuk menyimpan data dan dapat menggunakan presisi 24 hingga 53 digit.
Karena pilihan desain ini, bilangan floating point dapat bekerja dengan bilangan dengan jumlah desimal yang besar secara efisien, tetapi tidak selalu tepat. Representasi internal angka dapat menyebabkan sedikit perbedaan antara input dan output. Hal ini dapat menyebabkan perilaku tak terduga saat membandingkan nilai, mengerjakan matematika floating point, atau melakukan operasi yang memerlukan nilai eksak.
Titik mengambang vs numerik
Kedua angka floating point disediakan oleh tipe seperti FLOAT
dan DOUBLE
dan nomor titik tetap yang disediakan oleh NUMERIC
atau DECIMAL
jenis dapat digunakan untuk menyimpan nilai desimal. Bagaimana Anda tahu mana yang harus digunakan?
Aturan umumnya adalah jika Anda membutuhkan ketelitian dalam perhitungan Anda, NUMERIC
jenis selalu merupakan pilihan yang lebih baik. NUMERIC
type akan menyimpan nilai persis seperti yang disediakan, yang berarti bahwa hasilnya sepenuhnya dapat diprediksi saat mengambil atau menghitung nilai. NUMERIC
tipe disebut presisi arbitrer karena Anda menentukan jumlah presisi yang dibutuhkan tipe dan itu akan menyimpan jumlah digit yang tepat di bidang.
Sebaliknya, jenis seperti FLOAT
dan DOUBLE
adalah tipe presisi variabel. Jumlah presisi yang mereka pertahankan tergantung pada nilai input. Ketika mereka mencapai akhir tingkat presisi yang diizinkan, mereka mungkin membulatkan digit yang tersisa, yang mengarah ke perbedaan antara nilai yang dikirimkan dan yang diambil.
Jadi kapan Anda akan menggunakan tipe presisi variabel? Jenis presisi variabel seperti FLOAT
dan DOUBLE
sangat cocok untuk skenario di mana nilai pasti tidak diperlukan (misalnya, jika mereka akan dibulatkan) dan ketika kecepatan sangat berharga. Presisi variabel umumnya akan menawarkan manfaat kinerja dibandingkan NUMERIC
ketik.
Jenis string
Tipe karakter dan tipe string MySQL dapat ditempatkan ke dalam dua kategori:panjang tetap dan panjang variabel . Pilihan di antara keduanya memengaruhi cara MySQL mengalokasikan ruang untuk setiap nilai dan cara memvalidasi input.
Tipe data berbasis karakter yang paling sederhana dalam MySQL adalah char
Tipe. Tanpa argumen, char
type menerima satu karakter sebagai input:
CHAR
Ketika bilangan bulat positif diberikan dalam deklarasi, char
kolom akan menyimpan string karakter dengan panjang tetap sama dengan jumlah karakter yang ditentukan:
CHAR(10)
Jika string diberikan dengan karakter yang lebih sedikit, spasi kosong akan ditambahkan untuk mengisi panjangnya:
Masukan | # karakter masukan | Nilai yang disimpan | # karakter yang disimpan |
---|---|---|---|
'pohon' | 4 | 'pohon ' | 10 |
Jika string diberikan dengan jumlah karakter yang lebih besar dari yang diizinkan, MySQL akan memunculkan kesalahan. Sebagai pengecualian untuk aturan ini, jika karakter yang meluap adalah semua spasi, MySQL hanya akan memotong spasi berlebih agar sesuai dengan bidang.
Alternatif untuk bidang karakter panjang tetap adalah bidang panjang variabel. Untuk ini, MySQL menyediakan varchar
Tipe. varchar
type menyimpan karakter tanpa ukuran tetap. Tidak seperti char
, varchar
tidak dapat digunakan tanpa menentukan jumlah maksimum karakter yang akan disimpan.
Dengan mendefinisikan varchar
dengan bilangan bulat positif, Anda dapat mengatur panjang string maksimum:
VARCHAR(10)
Ini berbeda dengan menggunakan char
ketik dengan integer di varchar
tidak akan mengisi nilai jika input tidak memenuhi panjang bidang maksimum:
Masukan | # karakter masukan | Nilai yang disimpan | # karakter yang disimpan |
---|---|---|---|
'pohon' | 4 | 'pohon' | 4 |
Jika string lebih besar dari panjang maksimum, MySQL akan melempar kesalahan. Perilaku pemotongan yang sama yang ada di char
kolom terjadi di sini:jika karakter yang meluap adalah spasi, karakter tersebut akan dipotong agar sesuai dengan panjang karakter maksimum.
MySQL juga mendukung binary
dan varbinary
tipe data. Ini beroperasi dengan cara yang mirip dengan char
dan varchar
jenis, tetapi menyimpan string biner daripada string karakter. Ini berimplikasi pada bagaimana mereka disimpan dan dioperasikan (untuk hal-hal seperti perbandingan, penyortiran, dll.).
Untuk binary
dan varbinary
jenis, bilangan bulat yang diberikan saat mendefinisikan jenis kolom mewakili jumlah byte, bukan jumlah karakter.
Dua tipe data lain yang disediakan MySQL untuk penyimpanan string dan karakter adalah blob
dan text
. Jenis ini beroperasi mirip dengan varchar
dan varbinary
jenis masing-masing dan dimaksudkan untuk menyimpan benda-benda besar. Mereka beroperasi sebagian besar sama dengan rekan-rekan mereka, tetapi memiliki beberapa perbedaan seperti tidak dapat memiliki nilai default dan membutuhkan panjang awalan saat membuat indeks.
Booleans
MySQL sebenarnya tidak memiliki tipe boolean asli untuk mewakili nilai benar dan salah.
MySQL mengenali tipe BOOL
atau BOOLEAN
dalam upaya untuk kompatibilitas dengan sistem database lainnya. Namun, implementasi internalnya menggunakan TINYINT(1)
kolom untuk menyimpan nilai dan menafsirkannya sebagai benar atau salah berdasarkan seperangkat aturan.
Saat menafsirkan nilai numerik dalam konteks boolean, nilai 0
dianggap palsu. Semua nilai bukan nol dianggap benar.
MySQL mengenali literal boolean TRUE
dan FALSE
dan mengonversi TRUE
ke 1 dan FALSE
ke 0 saat menyimpannya.
Tanggal dan waktu
MySQL memiliki dukungan untuk merepresentasikan tanggal, waktu, dan kombinasi keduanya.
Tanggal
date
type dapat menyimpan tanggal tanpa nilai waktu yang terkait:
DATE
Saat memproses input untuk date
kolom, MySQL dapat menafsirkan format yang berbeda untuk menentukan tanggal yang benar untuk menyimpan. Namun, bagian-bagian komponen harus selalu datang dalam urutan yang sama:tahun, bulan, dan kemudian hari. STR_TO_DATE()
fungsi tersedia untuk membantu mengonversi format tanggal lain ke format yang akan ditafsirkan oleh MySQL dengan benar.
Saat menampilkan tanggal, MySQL menggunakan YYYY-MM-DD
format. Anda dapat menggunakan DATE_FORMAT()
berfungsi untuk memformat output dalam format lain.
date
type dapat menyimpan nilai mulai dari 1000-01-01
ke 9999-12-31
.
Waktu
time
tipe data dapat menyimpan waktu tertentu dalam sehari tanpa zona waktu atau tanggal yang terkait.
Saat memproses input untuk time
kolom, MySQL dapat menafsirkan berbagai format untuk menentukan waktu yang tepat untuk menyimpan. Ketika input memiliki titik dua, biasanya diartikan sebagai hh:mm:ss
. Setiap nilai yang dipersingkat (hanya menggunakan satu kolom) akan ditafsirkan menggunakan hh:mm
. Ketika input tidak memiliki titik dua, waktu diproses untuk mengisi nilai terkecil terlebih dahulu. Misalnya, 1045
diambil sebagai 10 menit dan 45 detik.
MySQL juga mendukung pecahan detik jika titik desimal diberikan. Ini menyimpan hingga 6 digit presisi setelah desimal. Nilai dalam time
kolom dapat berkisar dari -838:59:59.000000
ke 838:59:59.000000
.
Saat menampilkan nilai waktu, MySQL menggunakan hh:mm:ss
format. Seperti halnya tanggal, sebuah fungsi disediakan, yang disebut TIME_FORMAT()
untuk menampilkan nilai waktu menggunakan format lain.
Stempel waktu dan waktu tanggal
MySQL dapat mewakili stempel waktu, kombinasi tanggal dan waktu yang digunakan untuk mewakili momen waktu tertentu, dalam dua variasi berbeda:menggunakan timestamp
ketik dan datetime
ketik.
datetime
type dapat mewakili nilai dari 1000-01-01 00:00:00
ke 9999-12-31 23:59:59
. Ini juga dapat mencakup pecahan detik hingga enam digit yang mirip dengan time
ketik.
timestamp
type dapat mewakili nilai dari 1970-01-01 00:00:01
UTC ke 2038-01-19 03:14:07
UTC. Itu dapat menangani detik pecahan juga. Saat menyimpan timestamp
nilai, semua nilai dikonversi dari zona waktu yang diberikan ke UTC untuk penyimpanan dan dikonversi kembali ke zona waktu lokal pada pengambilan. datetime
ketik tidak melakukan ini.
Mulai MySQL 8.0.19 dan seterusnya, Anda dapat menyertakan offset zona waktu saat menyimpan timestamp
untuk secara eksplisit mengatur zona waktu untuk nilai yang disimpan. Anda melakukan ini dengan memasukkan nilai setelah komponen waktu, tanpa spasi untuk menunjukkan offset. Rentang nilai yang diterima dimulai dari -14:00
ke +14:00
, yang mewakili offset dari nilai yang disimpan dari UTC.
Saat memutuskan apakah akan menyimpan nilai tanggal dan waktu menggunakan datetime
atau timezone
jenis, sering kali membantu untuk memisahkan mereka berdasarkan apa yang terbaik untuk mereka.
Pikirkan datetime
nilai sebagai tanggal dan waktu tertentu, dalam kaitannya dengan kalender dan jam di mana pun itu diambil. Jika seseorang pergi tidur pada jam 11 malam, sebuah datetime
nilai dapat mewakili nilai tersebut, terlepas dari zona waktu orang tersebut saat ini.
Sebaliknya, timezone
nilai terbaik dalam mewakili momen tertentu dalam waktu yang tidak ambigu di seluruh zona waktu. Untuk mengirim undangan panggilan video, timezone
value akan dapat memastikan rapat terjadi pada waktu yang sama untuk semua orang, terlepas dari zona waktu peserta.
Jenis berguna lainnya
Seiring dengan jenis yang kami bahas dengan beberapa kedalaman di atas, ada jenis tambahan yang berguna dalam skenario tertentu. Kami akan membahasnya secara singkat untuk memberi Anda gambaran tentang cara menggunakannya dan kapan mereka dapat berguna.
Enumerated dan set types
Dua jenis terkait yang memungkinkan pengguna untuk menentukan nilai yang valid untuk kolom adalah enum
dan set
jenis.
enum
type adalah tipe string yang memungkinkan pengguna untuk menentukan kumpulan nilai yang valid saat kolom dibuat. Nilai apa pun yang cocok dengan salah satu nilai yang ditentukan akan diterima dan semua nilai lainnya ditolak. Fungsi ini mirip dengan menu tarik-turun di mana pilihan dapat dibuat dari serangkaian opsi tertentu. Misalnya, sebuah enum
disebut season
dapat dibuat dengan nilai winter
, spring
, summer
, dan autumn
.
Untuk membuat enum
kolom, tentukan jenisnya sebagai enum
, memberikan nilai yang mungkin sebagai string, dipisahkan dengan koma, di dalam kumpulan tanda kurung, seperti ini:
season ENUM('winter', 'spring', 'summer', 'autumn')
Jenis serupa dari jenis yang ditentukan pengguna adalah set
Tipe. Seperti enum
ketik, set
jenis memungkinkan pengguna untuk menentukan nilai yang valid sebagai string pada definisi. Perbedaan antara kedua jenis ini adalah dalam set
, lebih dari satu nilai dapat disimpan untuk setiap record.
Misalnya, jika Anda memerlukan kolom untuk mewakili hari dalam seminggu sukarelawan tersedia untuk bekerja, Anda dapat memiliki set
kolom seperti ini:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Saat memasukkan nilai untuk availability
kolom yang baru saja kami buat, Anda memberikan satu string dengan koma yang memisahkan semua hari sukarelawan tersedia. Misalnya:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
Untuk set
jenis di MySQL, nilai duplikat dalam input selalu dihapus dan setelah pengambilan, nilai mengikuti urutan yang digunakan dalam set
definisi terlepas dari urutannya saat dimasukkan ke dalam kolom.
JSON
MySQL mendukung kolom di JSON menggunakan json
Tipe. Data disimpan sebagai json
disimpan dalam biner untuk eksekusi dan pemrosesan yang lebih cepat sehingga server tidak perlu menafsirkan string untuk beroperasi pada JSON
nilai.
JSON
Untuk beroperasi pada JSON
kolom, MySQL menyediakan sejumlah fungsi untuk bekerja dengan nilai dalam dokumen.
Kesimpulan
Pada artikel ini, kita telah membahas banyak tipe data paling umum yang berguna saat bekerja dengan database MySQL. Ada jenis tambahan yang tidak tercakup dalam panduan ini yang berguna untuk diketahui, tetapi ini merupakan titik awal yang baik untuk sebagian besar kasus penggunaan.
Penting untuk menggunakan sistem tipe dengan tepat sehingga Anda dapat mengontrol nilai yang valid dan mengoperasikan data seperti yang diharapkan. Ada jebakan yang dapat Anda hadapi jika memilih jenis yang tidak cocok untuk data Anda, jadi mempertimbangkannya sebelum Anda berkomitmen pada jenis data bermanfaat dalam banyak kasus.
Jika Anda menggunakan Prisma Client untuk bekerja dengan database MySQL Anda, Anda dapat menemukan pemetaan antara beberapa jenis MySQL dan Prisma yang umum di dokumen konektor data MySQL Prisma.