Czy istnieje coś takiego jak niestandardowe typy danych?

14

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_ATONdla 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ą 2038przy 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 ENUMs można podzielić na niestandardowy typ danych, dzięki czemu DESCRIBEdane 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_ATONfunkcja.

MS SQL wydaje się mieć coś takiego , ale chciałbym wiedzieć, czy to coś więcej niż tylko synonim. (na przykład booleanmoże być synonimem tinyint(1), lub postal_codejednym z charlub varchar (5lub 9lub 10)) Synonimy nie są tym, o co tutaj pytam.

Bryan Field
źródło
prosta odpowiedź afaik dla mysql: nie. Byłoby ciekawie zobaczyć, jak inne RDBMS sobie z tym radzą
Derek Downey
@DTest: masz CREATE TYPE w SQL Server: teraz przydatne dla typów CLR. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn
1
@George Bailey: Twój link do SQL Server jest nieaktualny: dotyczy SQL Server 2000. A MySQL patrz stackoverflow.com/q/2451435/27535
gbn
@gbn (odpowiedź na pierwszym komentarzu) Czy tłumaczenie typu włączone, to przekształcić na przykład IPv6w binary(16), czy jest to ograniczone do aliasing (które mogą być wykorzystane do states stając enumów)
Bryan Pole
1
Należy pamiętać, że przechowywanie kodów pocztowych jako nieint 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.
Clockwork-Muse,

Odpowiedzi:

14

Czy MySQL obsługuje jakieś niestandardowe typy danych?

Prosta odpowiedź: nie

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łałem w aplikacji funkcję taką jak funkcja INET_ATON.

Oracle ma, CREATE TYPEco jest do pewnego stopnia analogiczne do klasy OO, w tym funkcje takie jak funkcje członka i dziedziczenie

Postgres ma CREATE TYPEtrochę 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 DOMAINmoż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 TYPEumożliwia tworzenie niestandardowych typów danych na podstawie istniejącego typu danych systemowych. Na przykład mógłbym utworzyć typ o nazwie, SSNktóry jest zasadniczo zdefiniowany jako, VARCHAR(11)ale w ten sposób nie muszę pamiętać, jak duże jest to pole.

Jack Douglas
źródło
1
Prosimy o umieszczenie i edycję tej odpowiedzi, abyśmy mogli uzyskać ostateczne odniesienie. Czułem, że pytanie nadaje się do odpowiedzi CW ...
Jack mówi, spróbuj spróbować topanswers.xyz
0

Firebird ma również swoje rozwiązanie za pośrednictwem domen .

W Firebird koncepcja „typu danych zdefiniowanego przez użytkownika” jest implementowana w postaci domeny. Oczywiście, tworzenie domeny nie tworzy nowego typu danych. Domena zapewnia sposób na obudowanie istniejącego typu danych zestawem atrybutów i udostępnienie tej „kapsułki” do wielokrotnego użytku w całej bazie danych. Jeśli kilka tabel potrzebuje kolumn zdefiniowanych z identycznymi lub prawie identycznymi atrybutami, domena ma sens.

Wykorzystanie domeny nie ogranicza się do definicji kolumn dla tabel i widoków. Domen można używać do deklarowania parametrów wejściowych i wyjściowych oraz zmiennych w kodzie PSQL.

Tibor
źródło
Czy Firebird MySQL?
Anthony Genovese,
Nie, Firebird to Firebird :) Właśnie wspomniałem jako inny RDMS, który ma taką funkcję.
Tibor,