MySQL'in özel veri türleri için desteği var mı? Örneğin, posta kodları bir varchar(10)
alanda saklanabilir , ancak int
boş 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_ATON
IPv4 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
2038
az 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
ENUM
s, özel bir veri türüne ayrılabilir; böyleceDESCRIBE
çı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 boolean
eş anlamlısı olabilir tinyint(1)
veya postal_code
biri için char
ya varchar
(5
ya 9
ya 10)
) eşanlamlılar Ben yaklaşık burada soruyorum değil ne.
IPv6
bir içine binary(16)
, ya da (için kullanılabilecek olan bu aliasing ile sınırlı olan state
lar haline enum
ler)
int
will 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.