Özel Veri Türleri diye bir şey var mı?


14

MySQL'in özel veri türleri için desteği var mı? Örneğin, posta kodları bir varchar(10)alanda saklanabilir , ancak intboş seçenekleri ve 5 basamaklı veya 5 + 4 basamaklı posta kodu olup olmadığını gösteren bir bayrakla sıkıştırılabilir .

Bu tür şeyler için kesintisiz veri türleri kurmanın bir yolu var mı? Uygulama ile ilgili olarak, bir dize türü olurdu, uygulama geçersiz veri geçerse, sadece veri kesilmesi (uyarı ile veya uyarı olmadan) olurdu.

Özel işlevler kullanılabilir (örneğin, INET_ATONIPv4 adresleri için yerleşik bir işlev vardır, ancak bu, zip LIKE '12345%'düzgün bir şekilde dizine eklenmesi gereken şeylere izin vermez.Özel veri türleri için iyi yazılmış bir destek, bir veri türünün işaretlenmesine izin verir Böylece, kompakt zip int, sıralandığında, sanki a zip varchar(10).

Bu, kolonun genişliğinin sabitlenmesine izin verir, 6 veya 10 baytlık değişken depolamanın sabit genişliğin 4 baytına kadar kesilmesine izin verir.

Birkaç geçerli kullanım vardır

  • Posta Kodları
  • IPv6 adresleri
  • Daha 2038az depolama alanı kullanımının ötesinde, dakika düzeyinde kesinlik ve kapasiteye sahip özel zaman damgası alanları datetime, ancak uygulama yılından önceki tarihleri ​​desteklemeye gerek yoktur (bunlar, sistemdeki en eski tarihler ise min 2007 olabilir)
  • DST uygulayan zaman damgaları ( var gibi görünmüyor )
  • İki harfli ABD durumu tek bir baytta saklanabilir
  • long ENUMs, özel bir veri türüne ayrılabilir; böylece DESCRIBEçıktısı, tüm sarmalarla o kadar dağınık olmaz.

Veri türü işleyicilerinin, işlevlerin depolanma biçimine benzer şekilde depolanmasını bekliyorum.

Herhangi bir veritabanı motorunda uzaktan böyle bir şey var mı? Çoğunlukla MySQL kullanıyorum, ancak uygulamanın şimdiye kadar uygulanmış olup olmadığını merak ediyorum, uygulamanın fonksiyon gibi bir işlevi çağırması kısa INET_ATON.

MS SQL bu tür bir şey var gibi görünüyor , ama ben sadece bir eşanlamlıdan daha fazlası olup olmadığını bilmek istiyorum. (örneğin booleaneş anlamlısı olabilir tinyint(1)veya postal_codebiri için charya varchar (5ya 9ya 10)) eşanlamlılar Ben yaklaşık burada soruyorum değil ne.


mysql için basit cevap afaik: hayır. Diğer RDBMS'lerin bu şeyleri nasıl ele aldığını görmek ilginç olurdu
Derek Downey

@DTest: SQL Server'da CREATE TYPE var: CLR türleri için kullanışlı. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@George Bailey: SQL Server bağlantınız güncel değil: SQL Server 2000 içindir. Ve MySQL için bkz. Stackoverflow.com/q/2451435/27535
gbn

@gbn, (ilk yorumuna tepki) örneğin bir dönüştürme, tip çeviri dahil mi IPv6bir içine binary(16), ya da (için kullanılabilecek olan bu aliasing ile sınırlı olan statelar haline enumler)
Bryan Alan

1
Bir şekilde fermuar kodlarını saklamak lütfen unutmayın intwill not Kanada, örneğin, 'A9A A9A' biçimini kullanır - bir uluslararası veritabanı için işin. Posta kodları için özel bir veri türü oluşturmak muhtemelen iyi bir fikirdir; ancak, bunlardan bazılarıyla nasıl başa çıkmayı planladığınızı yeniden incelemek isteyebilirsiniz (örneğin, durumu tek baytlık bir alanda depolamanın potansiyel 'diğer' sorunları vardır). Ayrıca, sağlananlar kullanılamaz şekilde eksik değilse (boyut sayılmaz), tarih / saat veri türlerini yeniden uygulamayın; yalnızca insanları karıştırırsınız.
Clockwork-Muse

Yanıtlar:


14

MySQL'in özel veri türleri için desteği var mı?

Basit cevap: hayır

Herhangi bir veritabanı motorunda uzaktan böyle bir şey var mı? Çoğunlukla MySQL kullanıyorum, ancak uygulamanın INET_ATON işlevi gibi bir işlevi çağırmasını sağlamadan kısa bir süre önce uygulanmış olup olmadığını merak ediyorum.

Oracle, CREATE TYPEüye işlevleri ve kalıtım gibi özellikler de dahil olmak üzere bir dereceye kadar OO sınıfına benzer.

Postgres, CREATE TYPEOO sınıflarına biraz daha az sahiptir (üye işlevleri veya kalıtım yok) ancak inanılmaz derecede esnek ve kullanışlıdır, hatta yeni temel türler oluşturmanıza izin verir. Orada da CREATE DOMAINmiras veya alt yazarak bir çeşit verir ve temelde bazı kısıtlamalarla bir taban türü oluşturarak geçer. Postgres ayrıca varsayılan olarak birkaç inet ve geometrik tür gibi birkaç ilginç taban türüne sahiptir. Postgres'de, bu örnekte olduğu gibi, burada özel bir veri türü için C'ye bir uzantı yazabilir .

SQL Server, CREATE TYPEvarolan bir sistem veri türüne göre özel bir veri türü oluşturmanıza olanak tanır. Örneğin SSN, temel olarak tanımlanmış bir tür oluşturabilirdim VARCHAR(11)ama bu şekilde bir alanın ne kadar büyük olduğunu hatırlamak zorunda değilim.


1
Kesin bir referans alabilmemiz için lütfen bu cevabı toplayıp düzenlemekten çekinmeyin. Sorunun bir CW cevabı verdiğini hissettim ...
Jack diyor ki topanswers.xyz

0

Firebird ayrıca etki alanları aracılığıyla çözümüne sahiptir .

Firebird'de, “kullanıcı tanımlı veri türü” kavramı alan adı biçiminde uygulanır. Bir etki alanı oluşturmak, elbette yeni bir veri türü oluşturmaz. Etki alanı, mevcut bir veri türünü bir dizi öznitelikle kapsüllemek ve bu “kapsülü” tüm veritabanında çoklu kullanım için kullanılabilir hale getirmek için araçlar sağlar. Birkaç tablonun özdeş veya neredeyse özdeş özniteliklerle tanımlanmış sütunlara ihtiyacı varsa, bir etki alanı anlamlı olur.

Etki alanı kullanımı, tablolar ve görünümler için sütun tanımlarıyla sınırlı değildir. Etki alanları, PSQL kodundaki giriş ve çıkış parametrelerini ve değişkenlerini bildirmek için kullanılabilir.


Firebird MySQL mi?
Anthony Genovese

Hayır, Firebird Firebird :) Sadece böyle bir özelliği olan RDMS olarak bahsetmiştim.
Tibor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.