Czy MySQL obsługuje jakieś niestandardowe typy danych? Na przykład, kody pocztowe mogą być przechowywane w varchar(10)
polu, ale mogą być spakowane do int
, z opcjami pustymi i flagą wskazującą, czy jest to 5-cyfrowy, czy 5 + 4-cyfrowy kod pocztowy.
Czy istnieje sposób instalowania płynnych typów danych dla takich rzeczy? Jeśli chodzi o aplikację, byłby to ciąg znaków, byłoby po prostu obcinanie danych (z ostrzeżeniem lub bez), gdyby aplikacja przekazała nieprawidłowe dane.
Można użyć funkcji niestandardowych (na przykład istnieje wbudowana funkcja INET_ATON
dla adresów IPv4. Ale to nie pozwala na takie rzeczy, zip LIKE '12345%'
które powinny być odpowiednio indeksowane. Dobrze napisana obsługa niestandardowych typów danych pozwoliłaby na oznaczenie typu danych jak sortable. Więc kompaktowy zip int
, gdy sortowane, będzie porządek, tak jakby to było zip varchar(10)
.
Pozwoliłoby to na ustalenie szerokości kolumny, pozwoliłoby na zmniejszenie pojemności pamięci 6 lub 10 bajtów do 4 bajtów o stałej szerokości.
Istnieje kilka odpowiednich zastosowań
- Kody pocztowe
- Adresy IPv6
- Niestandardowe pola znaczników czasu z dokładnością na poziomie minuty i pojemnością przekraczającą
2038
przy mniejszym zużyciu pamięci niżdatetime
, ale bez potrzeby obsługi dat przed rokiem wdrożenia (powiedzmy, że min może być 2007, jeśli są to najstarsze daty w systemie) - Znaczniki czasu, które implementują czas letni ( wydaje się, że nie istnieje )
- Dwuliterowy stan USA może być przechowywany w jednym bajcie
- długie
ENUM
s można podzielić na niestandardowy typ danych, dzięki czemuDESCRIBE
dane wyjściowe nie byłyby tak niechlujne z całym opakowaniem.
Oczekuję, że procedury obsługi typów danych będą przechowywane podobnie do sposobu przechowywania funkcji.
Czy jest coś takiego zdalnie w dowolnym silniku bazy danych? Najczęściej używam MySQL, ale jestem ciekawy, czy to kiedykolwiek zostało zaimplementowane, poza tym, że wywołanie tej aplikacji było funkcją taką jak INET_ATON
funkcja.
MS SQL wydaje się mieć coś takiego , ale chciałbym wiedzieć, czy to coś więcej niż tylko synonim. (na przykład boolean
może być synonimem tinyint(1)
, lub postal_code
jednym z char
lub varchar
(5
lub 9
lub 10)
) Synonimy nie są tym, o co tutaj pytam.
źródło
IPv6
wbinary(16)
, czy jest to ograniczone do aliasing (które mogą być wykorzystane dostate
s stającenum
ów)int
będzie działać w przypadku internacjonalizowanej bazy danych - na przykład Kanada używa formatu „A9A A9A”. Stworzenie niestandardowego typu danych dla kodów pocztowych jest prawdopodobnie dobrym pomysłem; możesz jednak chcieć ponownie zbadać, w jaki sposób planujesz poradzić sobie z niektórymi z nich (na przykład przechowywanie stanu w polu jednobajtowym może potencjalnie powodować „inne” problemy). I nie należy ponownie wdrażać typów danych daty / godziny, chyba że podane są zwykle zwykle niewystarczające (rozmiar się nie liczy) - po prostu pomylisz ludzi.Odpowiedzi:
Prosta odpowiedź: nie
Oracle ma,
CREATE TYPE
co jest do pewnego stopnia analogiczne do klasy OO, w tym funkcje takie jak funkcje członka i dziedziczeniePostgres ma
CREATE TYPE
trochę mniej podobny do klas OO (bez funkcji składowych lub dziedziczenia), ale jest niezwykle elastyczny i użyteczny, nawet pozwalając na tworzenie nowych typów bazowych. Istnieje równieżCREATE DOMAIN
możliwość dziedziczenia lub podtypowania i zasadniczo rozszerza typ podstawowy z pewnymi ograniczeniami. Postgres ma również domyślnie całkiem sporo interesujących typów bazowych, np. Inet i typy geometryczne . W Postgres można napisać rozszerzenie w C dla niestandardowego typu danych, takiego jak w tym przykładzie z typem danych base36 .Program SQL Server
CREATE TYPE
umożliwia tworzenie niestandardowych typów danych na podstawie istniejącego typu danych systemowych. Na przykład mógłbym utworzyć typ o nazwie,SSN
który jest zasadniczo zdefiniowany jako,VARCHAR(11)
ale w ten sposób nie muszę pamiętać, jak duże jest to pole.źródło
Firebird ma również swoje rozwiązanie za pośrednictwem domen .
źródło