Esistono tipi di dati personalizzati?


14

MySQL ha supporto per tipi di dati personalizzati? Ad esempio, i codici postali potrebbero essere memorizzati in un varchar(10)campo, ma potrebbero essere compattati in un int, con opzioni per lo spazio vuoto e un contrassegno a seconda che si tratti di un codice postale di 5 cifre o 5 + 4 cifre.

Esiste un modo per installare tipi di dati senza soluzione di continuità per tali cose? Per quanto riguarda l'applicazione, sarebbe un tipo di stringa, ci sarebbe semplicemente il troncamento dei dati (con o senza avviso), se l'applicazione passasse dati non validi.

Potrebbero essere utilizzate funzioni personalizzate (ad esempio, esiste una funzione integrata INET_ATONper gli indirizzi IPv4. Ma ciò non consente le cose zip LIKE '12345%'che dovrebbero essere adeguatamente indicizzate. Un supporto ben scritto per tipi di dati personalizzati consentirebbe di contrassegnare un tipo di dati ordinabile. Quindi il compatto zip int, una volta ordinato, si ordinava come se fosse un zip varchar(10).

Ciò consentirebbe di fissare la larghezza della colonna, consentirebbe di ridurre la memoria variabile a 6 o 10 byte a 4 byte di larghezza fissa.

Esistono diversi usi applicabili

  • Codici di avviamento postale
  • Indirizzi IPv6
  • Campi di data / ora personalizzati con precisione e capacità a livello di minuto oltre 2038con un utilizzo dello storage inferiore rispetto a datetime, ma non è necessario supportare le date prima dell'anno di implementazione (supponiamo che il minimo potrebbe essere il 2007 se queste sono le date più vecchie nel sistema)
  • Timestamp che implementano l'ora legale (che non sembrano esistere )
  • Lo stato americano a due lettere può essere memorizzato in un singolo byte
  • long ENUMs può essere separato in un tipo di dati personalizzato in modo che DESCRIBEl'output non sia così disordinato con tutto il wrapping.

Mi aspetto che i gestori del tipo di dati vengano archiviati in modo simile al modo in cui sono memorizzate le funzioni.

C'è qualcosa di remoto come questo su qualsiasi motore di database? Uso principalmente MySQL, ma sono curioso di sapere se questo è mai stato implementato, a parte il fatto che l'applicazione chiama una funzione come la INET_ATONfunzione.

MS SQL sembra avere qualcosa del genere , ma vorrei sapere se è qualcosa di più di un semplice sinonimo. (ad esempio booleanpotrebbe essere un sinonimo di tinyint(1), o postal_codedi uno charo varchar (5oppure 9oppure 10)) I sinonimi non sono ciò di cui mi sto chiedendo qui.


risposta semplice afaik per mysql: no. Sarebbe interessante vedere come altri RDBMS gestiscono queste cose
Derek Downey,

@DTest: hai CREATE TYPE in SQL Server: utile per i tipi CLR ora. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@George Bailey: il tuo link SQL Server non è aggiornato: è per SQL Server 2000. E per MySQL vedi stackoverflow.com/q/2451435/27535
gbn

@gbn, (risposta al primo commento) È inclusa la traduzione del tipo, convertirà ad esempio un IPv6in un binary(16), o si limiterà all'aliasing (che potrebbe essere usato per statediventare enums)
Bryan Field

1
Si prega di essere consapevole del fatto che la memorizzazione zip-codes come intsarà non lavoro per un database internazionalizzato - Canada, ad esempio, utilizza il formato di 'A9A A9A'. La creazione di un tipo di dati personalizzato per i codici postali è probabilmente una buona idea; tuttavia, potresti voler riesaminare il modo in cui stai pianificando di affrontarne alcuni (la memorizzazione dello stato in un campo a byte singolo presenta potenziali "altri" problemi, ad esempio). E non implementare nuovamente i tipi di dati data / ora, a meno che quelli forniti non siano inutilmente carenti (le dimensioni non contano): confonderai semplicemente le persone.
Clockwork-Muse

Risposte:


14

MySQL ha supporto per tipi di dati personalizzati?

Risposta semplice: no

C'è qualcosa di remoto come questo su qualsiasi motore di database? Uso principalmente MySQL, ma sono curioso di sapere se questo è mai stato implementato, a parte il fatto che l'applicazione chiama una funzione come la funzione INET_ATON.

Oracle ha CREATE TYPEanalogo in una certa misura a una classe OO, incluse funzionalità come le funzioni membro e l' ereditarietà

Postgres ha CREATE TYPEche è un po 'meno simile alle classi OO (nessuna funzione membro o eredità) ma è incredibilmente flessibile e utile, anche permettendoti di creare nuovi tipi di base. Esiste anche CREATE DOMAINun metodo che consente una forma di ereditarietà o di sottotitoli e sostanzialmente estende un tipo di base con alcuni vincoli. Postgres ha anche alcuni tipi di base interessanti per impostazione predefinita, ad esempio tipi inet e geometrici . In Postgres è possibile scrivere un'estensione in C per un tipo di dati personalizzato, come in questo esempio qui con il tipo di dati base36 .

SQL Server ha CREATE TYPEche consente di creare un tipo di dati personalizzato basato su un tipo di dati di sistema esistente. Ad esempio, potrei creare un tipo chiamato SSNche è sostanzialmente definito come VARCHAR(11)ma in questo modo non devo ricordare quanto sia grande un campo.


1
Sentiti libero di accumulare e modificare questa risposta in modo da poter ottenere un riferimento definitivo. Ho sentito che la domanda si presta a una risposta in CW ...
Jack dice di provare topanswers.xyz il

0

Firebird ha anche la sua soluzione tramite domini .

In Firebird, il concetto di "tipo di dati definito dall'utente" è implementato sotto forma di dominio. La creazione di un dominio non crea veramente un nuovo tipo di dati, ovviamente. Un dominio fornisce i mezzi per incapsulare un tipo di dati esistente con una serie di attributi e rendere questa "capsula" disponibile per un uso multiplo nell'intero database. Se diverse tabelle richiedono colonne definite con attributi identici o quasi identici, un dominio ha senso.

L'utilizzo del dominio non è limitato alle definizioni di colonna per tabelle e viste. I domini possono essere utilizzati per dichiarare parametri e variabili di input e output nel codice PSQL.


Firebird è MySQL?
Anthony Genovese,

No, Firebird è Firebird :) Ho appena menzionato come altro RDMS che ha una tale funzione.
Tibor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.