Apakah ada yang namanya Jenis Data Kustom?

14

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_ATONbawaan 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 2038dengan penggunaan penyimpanan yang lebih sedikit daripada datetime, 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 ENUMs dapat dipisahkan menjadi tipe data khusus sehingga DESCRIBEoutput 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_ATONfungsi.

MS SQL tampaknya memiliki sesuatu yang sifatnya seperti itu , tetapi saya ingin tahu apakah ini lebih dari sekedar sinonim. (misalnya booleanbisa menjadi sinonim untuk tinyint(1), atau postal_codeuntuk salah satu charatau varchar (5atau 9atau 10)) Sinonim bukan yang saya tanyakan di sini.

Bryan Field
sumber
jawaban sederhana afaik untuk mysql: no. Ini akan menarik untuk melihat bagaimana RDBMS lain menangani hal-hal itu
Derek Downey
@Dest: Anda memiliki BUAT JENIS di SQL Server: berguna untuk jenis CLR sekarang. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn
1
@ George Bailey: tautan SQL Server Anda kedaluwarsa: ini untuk SQL Server 2000. Dan untuk MySQL, lihat stackoverflow.com/q/2451435/27535
gbn
@ gbn, (respons terhadap komentar pertama) Apakah termasuk terjemahan tipe, apakah akan mengonversi misalnya IPv6menjadi binary(16), atau terbatas pada aliasing (yang dapat digunakan untuk statemenjadi enums)
Lapangan Bryan
1
Perlu diketahui bahwa menyimpan pos-kode sebagai intakan 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.
Clockwork-Muse

Jawaban:

14

Apakah MySQL memiliki dukungan untuk tipe data khusus?

Jawaban sederhana: tidak

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 fungsi INET_ATON.

Oracle memiliki CREATE TYPEanalog dengan beberapa derajat ke kelas OO, termasuk fitur seperti fungsi anggota dan warisan

Postgres memiliki CREATE TYPEyang 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 juga CREATE DOMAINyang 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 TYPEyang memungkinkan Anda untuk membuat tipe data kustom berdasarkan pada tipe data sistem yang ada. Sebagai contoh saya bisa membuat jenis yang disebut SSNyang pada dasarnya didefinisikan sebagai VARCHAR(11)tetapi dengan cara ini saya tidak harus mengingat seberapa besar bidang itu.

Jack Douglas
sumber
1
Silakan menumpuk dan mengedit jawaban ini sehingga kami bisa mendapatkan referensi yang pasti. Saya merasa pertanyaan itu cocok dengan jawaban CW ...
Jack mengatakan coba topanswers.xyz
0

Firebird juga memiliki solusinya melalui domain .

Dalam Firebird, konsep "tipe data yang ditentukan pengguna" diimplementasikan dalam bentuk domain. Membuat domain tidak benar-benar membuat tipe data baru, tentu saja. Sebuah domain menyediakan sarana untuk merangkum tipe data yang ada dengan seperangkat atribut dan membuat "kapsul" ini tersedia untuk banyak penggunaan di seluruh basis data. Jika beberapa tabel memerlukan kolom yang didefinisikan dengan atribut yang identik atau hampir identik, sebuah domain masuk akal.

Penggunaan domain tidak terbatas pada definisi kolom untuk tabel dan tampilan. Domain dapat digunakan untuk mendeklarasikan parameter dan variabel input dan output dalam kode PSQL.

Tibor
sumber
Apakah Firebird MySQL?
Anthony Genovese
Tidak, Firebird adalah Firebird :) Saya baru saja menyebutkan sebagai nother RDMS yang memiliki fitur seperti itu.
Tibor