¿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í.
fuente
IPv6
en abinary(16)
, o se limitará a alias (que podría usarse parastate
convertirse enenum
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.Respuestas:
Respuesta simple: no
Oracle tiene
CREATE TYPE
algo similar a una clase OO, que incluye características como funciones miembro y herenciaPostgres tiene
CREATE TYPE
un poco menos parecido a las clases OO (sin funciones miembro o herencia) pero es increíblemente flexible y útil, incluso te permite crear nuevos tipos base. También existe elCREATE DOMAIN
que permite una forma de herencia o subtipo y básicamente extiende un tipo base con algunas restricciones. Postgres también tiene bastantes tipos de bases interesantes por defecto, por ejemplo, inet y tipos geométricos . En Postgres se puede escribir una extensión en C para un tipo de datos personalizado, como en este ejemplo aquí con el tipo de datos base36 .SQL Server tiene
CREATE TYPE
que le permite crear un tipo de datos personalizado basado en un tipo de datos del sistema existente. Por ejemplo, podría crear un tipo llamadoSSN
que se define básicamente como,VARCHAR(11)
pero de esta manera no tengo que recordar qué tan grande es un campo.fuente
Firebird también tiene su solución a través de dominios .
fuente