Apakah MySQL memiliki dukungan untuk tipe data khusus? Misalnya, kode pos mungkin disimpan dalam varchar(10)
bidang, tetapi bisa dipadatkan menjadi int
, dengan opsi kosong, dan bendera apakah kode pos 5 digit atau 5 + 4 digit.
Apakah ada cara untuk menginstal tipe data yang mulus untuk hal-hal seperti itu? Sejauh menyangkut aplikasi, itu akan menjadi tipe string, hanya akan ada pemotongan data (dengan atau tanpa peringatan), jika aplikasi melewati data yang tidak valid.
Fungsi khusus dapat digunakan (misalnya, ada fungsi INET_ATON
bawaan untuk alamat IPv4. Tetapi itu tidak memungkinkan hal-hal seperti zip LIKE '12345%'
yang harus diindeks dengan benar. Dukungan tertulis dengan baik untuk tipe data kustom akan memungkinkan tipe data ditandai. sebagai sortable. Jadi compact zip int
, ketika disortir, akan mengurutkan seolah-olah itu adalah zip varchar(10)
.
Ini akan memungkinkan untuk kolom menjadi lebar tetap, itu akan memungkinkan 6 atau 10 byte penyimpanan variabel akan dikurangi menjadi 4 bye dari lebar tetap.
Ada beberapa kegunaan yang berlaku
- Kode Pos
- Alamat IPv6
- Bidang cap waktu ubahsuaian dengan ketelitian tingkat menit dan kapasitas di luar
2038
dengan penggunaan penyimpanan yang lebih sedikit daripadadatetime
, tetapi tidak perlu mendukung tanggal sebelum tahun implementasi (mis. Min bisa 2007 jika tanggal tersebut merupakan tanggal tertua dalam sistem) - Stempel waktu yang menerapkan DST (yang sepertinya tidak ada )
- Status dua huruf US dapat disimpan dalam satu byte
- long
ENUM
s dapat dipisahkan menjadi tipe data khusus sehinggaDESCRIBE
output tidak akan terlihat berantakan dengan semua pembungkusnya.
Saya berharap penangan tipe data akan disimpan mirip dengan cara fungsi disimpan.
Apakah ada yang seperti ini pada mesin basis data? Saya kebanyakan menggunakan MySQL, tetapi saya ingin tahu apakah ini pernah diterapkan, singkat membuat aplikasi memanggil fungsi seperti INET_ATON
fungsi.
MS SQL tampaknya memiliki sesuatu yang sifatnya seperti itu , tetapi saya ingin tahu apakah ini lebih dari sekedar sinonim. (misalnya boolean
bisa menjadi sinonim untuk tinyint(1)
, atau postal_code
untuk salah satu char
atau varchar
(5
atau 9
atau 10)
) Sinonim bukan yang saya tanyakan di sini.
sumber
IPv6
menjadibinary(16)
, atau terbatas pada aliasing (yang dapat digunakan untukstate
menjadienum
s)int
akan tidak bekerja untuk database internasionalisasi - Kanada, misalnya, menggunakan format 'A9A A9A'. Membuat tipe data khusus untuk kode pos mungkin merupakan ide yang bagus; Namun, Anda mungkin ingin memeriksa kembali bagaimana Anda berencana berurusan dengan beberapa dari mereka (menyimpan negara dalam bidang byte tunggal memiliki potensi masalah 'lainnya', misalnya). Dan jangan menerapkan kembali tipe data tanggal / waktu, kecuali yang disediakan kurang memadai (ukuran tidak masuk hitungan) - Anda hanya akan membingungkan orang.Jawaban:
Jawaban sederhana: tidak
Oracle memiliki
CREATE TYPE
analog dengan beberapa derajat ke kelas OO, termasuk fitur seperti fungsi anggota dan warisanPostgres memiliki
CREATE TYPE
yang sedikit kurang seperti kelas OO (tidak ada fungsi anggota atau pewarisan) tetapi sangat fleksibel dan berguna, bahkan memungkinkan Anda untuk membuat jenis basis baru. Ada jugaCREATE DOMAIN
yang memungkinkan bentuk pewarisan atau sub-pengetikan dan pada dasarnya memperluas tipe dasar dengan beberapa kendala. Postgres juga memiliki beberapa tipe dasar yang menarik secara default, misalnya tipe inet dan geometrik . Dalam Postgres, seseorang dapat menulis ekstensi dalam C untuk tipe data khusus, seperti dalam contoh ini di sini dengan tipe data base36 .SQL Server memiliki
CREATE TYPE
yang memungkinkan Anda untuk membuat tipe data kustom berdasarkan pada tipe data sistem yang ada. Sebagai contoh saya bisa membuat jenis yang disebutSSN
yang pada dasarnya didefinisikan sebagaiVARCHAR(11)
tetapi dengan cara ini saya tidak harus mengingat seberapa besar bidang itu.sumber
Firebird juga memiliki solusinya melalui domain .
sumber