Gibt es benutzerdefinierte Datentypen?


14

Unterstützt MySQL benutzerdefinierte Datentypen? Zum Beispiel können Postleitzahlen in einem varchar(10)Feld gespeichert werden, sie können jedoch in ein Feld intmit Optionen für Leerzeichen und einer Markierung, ob es sich um eine 5-stellige oder eine 5 + 4-stellige Postleitzahl handelt, komprimiert werden.

Gibt es eine Möglichkeit, nahtlose Datentypen für solche Dinge zu installieren? Was die Anwendung betrifft, handelt es sich um einen Zeichenfolgentyp, und es wird einfach (mit oder ohne Warnung) abgeschnitten, wenn die Anwendung ungültige Daten übergibt.

Benutzerdefinierte Funktionen könnten verwendet werden (zum Beispiel gibt es eine integrierte Funktion INET_ATONfür IPv4-Adressen. Dies ermöglicht jedoch nicht, dass Dinge zip LIKE '12345%'ordnungsgemäß indiziert werden. Eine gut geschriebene Unterstützung für benutzerdefinierte Datentypen würde das Markieren eines Datentyps ermöglichen so sortierbar, dass der Compact zip intbeim Sortieren so aussortiert, als wäre er ein zip varchar(10).

Dies würde ermöglichen, dass die Spalte eine feste Breite hat, und dass der variable Speicher von 6 oder 10 Byte auf 4 Byes fester Breite reduziert werden kann.

Es gibt mehrere anwendbare Verwendungen

  • Postleitzahlen
  • IPv6-Adressen
  • Benutzerdefinierte Zeitstempelfelder mit einer Genauigkeit und Kapazität auf Minutenebene, die darüber hinaus 2038weniger Speicherplatz beanspruchen als datetime, aber keine Unterstützung für Daten vor dem Implementierungsjahr erforderlich sind (z. B. 2007, wenn dies die ältesten Daten im System sind).
  • Zeitstempel, die die Sommerzeit implementieren (die scheinbar nicht vorhanden sind )
  • Der US-Bundesstaat mit zwei Buchstaben kann in einem einzelnen Byte gespeichert werden
  • long ENUMs kann in einen benutzerdefinierten Datentyp unterteilt werden, sodass die DESCRIBEAusgabe bei all den Zeilenumbrüchen nicht so chaotisch aussieht.

Ich gehe davon aus, dass die Datentyp-Handler ähnlich wie die Funktionen gespeichert werden.

Gibt es so etwas in einer Datenbank-Engine? Ich benutze meistens MySQL, aber ich bin neugierig, ob dies jemals implementiert wurde, ohne dass die Anwendung eine Funktion wie die INET_ATONFunktion aufruft.

MS SQL scheint so etwas zu haben , aber ich würde gerne wissen, ob es mehr als nur ein Synonym ist. (könnte zum Beispiel booleanein Synonym für tinyint(1)oder postal_codefür eines von charoder varchar (5oder 9oder sein 10)) Synonyme sind nicht das, wonach ich hier frage.


einfache antwort afaik für mysql: nein. Es wäre interessant zu sehen, wie andere RDBMS mit diesen Dingen umgehen
Derek Downey

@DTest: Sie haben CREATE TYPE in SQL Server: jetzt nützlich für CLR-Typen. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@ George Bailey: Ihr SQL Server-Link ist veraltet: Es ist für SQL Server 2000. Und für MySQL siehe stackoverflow.com/q/2451435/27535
26.08.11

@gbn, (Antwort auf den ersten Kommentar) Ist die Typübersetzung enthalten, konvertiert es zum Beispiel ein IPv6in ein binary(16), oder ist es auf Aliasing beschränkt (das für states wird enums verwendet werden könnte)
Bryan Field

1
Bitte beachten Sie, dass das Speichern Postleitzahlen als intwird nicht Arbeit für eine internationalisierte Datenbank - Kanada, zum Beispiel das Format von ‚A9A A9A‘ verwendet. Es ist wahrscheinlich eine gute Idee, einen benutzerdefinierten Datentyp für Postleitzahlen zu erstellen. Möglicherweise möchten Sie jedoch noch einmal überprüfen, wie Sie mit einigen von ihnen umgehen möchten (das Speichern des Status in einem Einzelbyte-Feld hat beispielsweise potenzielle "andere" Probleme). Und implementieren Sie Datums- / Zeitdatentypen nicht erneut, es sei denn, die angegebenen Datentypen weisen einen nicht verwendbaren Mangel auf (Größe zählt nicht) - Sie verwirren nur die Menschen.
Clockwork-Muse

Antworten:


14

Unterstützt MySQL benutzerdefinierte Datentypen?

Einfache Antwort: nein

Gibt es so etwas in einer Datenbank-Engine? Ich verwende meistens MySQL, aber ich bin gespannt, ob dies jemals implementiert wurde, ohne dass die Anwendung eine Funktion wie die INET_ATON-Funktion aufruft.

Oracle verfügt über Funktionen, CREATE TYPEdie bis zu einem gewissen Grad einer OO-Klasse entsprechen, einschließlich Features wie Member-Funktionen und Vererbung

Postgres hat CREATE TYPEetwas weniger Ähnlichkeit mit OO-Klassen (keine Elementfunktionen oder Vererbung), ist jedoch unglaublich flexibel und nützlich, sodass Sie sogar neue Basistypen erstellen können. Es gibt auch CREATE DOMAINwelche, die eine Form der Vererbung oder Untertypisierung zulassen und im Grunde einen Basistyp mit einigen Einschränkungen erweitern. Postgres hat standardmäßig auch einige interessante Basistypen, z. B. inet- und geometrische Typen. In Postgres kann man eine Erweiterung in C für einen benutzerdefinierten Datentyp schreiben, wie in diesem Beispiel hier mit dem Datentyp base36 .

Mit SQL Server CREATE TYPEkönnen Sie einen benutzerdefinierten Datentyp erstellen, der auf einem vorhandenen Systemdatentyp basiert. Zum Beispiel könnte ich einen Typ namens erstellen, SSNder im Grunde genommen definiert ist als, VARCHAR(11)aber auf diese Weise muss ich mich nicht erinnern, wie groß ein Feld ist.


1
Fühlen Sie sich bitte frei, diese Antwort zu bearbeiten, damit wir eine endgültige Referenz erhalten können. Ich hatte das Gefühl, dass sich die Frage für eine CW-Antwort
anbietet

0

Firebird hat seine Lösung auch über Domains .

In Firebird wird das Konzept eines „benutzerdefinierten Datentyps“ in Form der Domäne implementiert. Das Erstellen einer Domäne erzeugt natürlich nicht wirklich einen neuen Datentyp. Eine Domain bietet die Möglichkeit, einen vorhandenen Datentyp mit einer Reihe von Attributen zu kapseln und diese „Kapsel“ für die mehrfache Verwendung in der gesamten Datenbank verfügbar zu machen. Wenn für mehrere Tabellen Spalten mit identischen oder nahezu identischen Attributen definiert werden müssen, ist eine Domäne sinnvoll.

Die Domänennutzung ist nicht auf Spaltendefinitionen für Tabellen und Ansichten beschränkt. Mithilfe von Domänen können Eingabe- und Ausgabeparameter und -variablen im PSQL-Code deklariert werden.


Ist Firebird MySQL?
Anthony Genovese

Nein, Firebird ist Firebird :) Ich habe gerade als weiteres RDMS erwähnt, das eine solche Funktion hat.
Tibor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.