¿MySQL tiene algún soporte para tipos de datos personalizados? Por ejemplo, los códigos postales se pueden almacenar en un varchar(10)
campo, pero se pueden compactar en un int
, con opciones de espacio en blanco, y un indicador de si se trata de un código postal de 5 dígitos o 5 + 4 dígitos.
¿Hay alguna manera de instalar tipos de datos sin problemas para tales cosas? En lo que respecta a la aplicación, sería un tipo de cadena, simplemente habría truncamiento de datos (con o sin advertencia), si la aplicación pasara datos no válidos.
Se podrían utilizar funciones personalizadas (por ejemplo, hay una función integrada INET_ATON
para las direcciones IPv4. Pero eso no permite cosas como las zip LIKE '12345%'
que deberían indexarse correctamente. Un soporte bien escrito para los tipos de datos personalizados permitiría marcar un tipo de datos como ordenable. Así que el compacto zip int
, cuando se clasifica, se clasificaría como si fuera un zip varchar(10)
.
Esto permitiría que la columna tuviera un ancho fijo, permitiría que el almacenamiento variable de 6 o 10 bytes se redujera a 4 byes de ancho fijo.
Hay varios usos aplicables.
- Códigos ZIP
- Direcciones IPv6
- Campos de marca de tiempo personalizados con precisión de nivel de minutos y capacidad más allá
2038
con menos uso de almacenamiento quedatetime
, pero no es necesario admitir fechas antes del año de implementación (digamos que el mínimo podría ser 2007 si esas son las fechas más antiguas del sistema) - Marcas de tiempo que implementan DST (que no parecen existir )
- El estado estadounidense de dos letras se puede almacenar en un solo byte
- los
ENUM
s largos se pueden separar en un tipo de datos personalizado para queDESCRIBE
la salida no se vea tan desordenada con todo el ajuste.
Espero que los manejadores de tipos de datos se almacenen de forma similar a la forma en que se almacenan las funciones.
¿Hay algo remotamente como esto en algún motor de base de datos? Principalmente uso MySQL, pero tengo curiosidad por saber si alguna vez se ha implementado, a menos que la aplicación llame a una función como la INET_ATON
función.
MS SQL parece tener algo de esa naturaleza , pero me gustaría saber si es más que un sinónimo. (por ejemplo, boolean
podría ser un sinónimo de tinyint(1)
, o postal_code
para uno de char
o varchar
(5
o 9
o 10)
) Los sinónimos no son lo que estoy preguntando aquí.
IPv6
en a binary(16)
, o se limitará a alias (que podría usarse para state
convertirse en enum
s)
int
lo hará no trabajo para una base de datos internacionalizado - Canadá, por ejemplo, utiliza el formato de 'A9a A9a'. Crear un tipo de datos personalizado para códigos postales es probablemente una buena idea; sin embargo, es posible que desee volver a examinar cómo planea lidiar con algunos de ellos (por ejemplo, almacenar el estado en un campo de un solo byte tiene problemas potenciales de "otros"). Y no vuelva a implementar los tipos de datos de fecha / hora, a menos que los proporcionados sean inusualmente deficientes (el tamaño no cuenta), solo confundirá a las personas.