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_ATON
per 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
2038
con un utilizzo dello storage inferiore rispetto adatetime
, 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
ENUM
s può essere separato in un tipo di dati personalizzato in modo cheDESCRIBE
l'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_ATON
funzione.
MS SQL sembra avere qualcosa del genere , ma vorrei sapere se è qualcosa di più di un semplice sinonimo. (ad esempio boolean
potrebbe essere un sinonimo di tinyint(1)
, o postal_code
di uno char
o varchar
(5
oppure 9
oppure 10)
) I sinonimi non sono ciò di cui mi sto chiedendo qui.
IPv6
in un binary(16)
, o si limiterà all'aliasing (che potrebbe essere usato per state
diventare enum
s)
int
sarà 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.