¿Existen los tipos de datos personalizados?


14

¿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_ATONpara 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á 2038con menos uso de almacenamiento que datetime, 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 ENUMs largos se pueden separar en un tipo de datos personalizado para que DESCRIBEla 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_ATONfunción.

MS SQL parece tener algo de esa naturaleza , pero me gustaría saber si es más que un sinónimo. (por ejemplo, booleanpodría ser un sinónimo de tinyint(1), o postal_codepara uno de charo varchar (5o 9o 10)) Los sinónimos no son lo que estoy preguntando aquí.


respuesta simple afaik para mysql: no. Sería interesante ver cómo otros RDBMS manejan esas cosas
Derek Downey

@DTest: tiene CREATE TYPE en SQL Server: útil para los tipos CLR ahora. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@ George Bailey: su enlace de SQL Server está desactualizado: es para SQL Server 2000. Y para MySQL, consulte stackoverflow.com/q/2451435/27535
gbn

@gbn, (respuesta al primer comentario) ¿Se incluye la traducción de tipos, se convertirá, por ejemplo, IPv6en a binary(16), o se limitará a alias (que podría usarse para stateconvertirse en enums)
Bryan Field

1
Tenga en cuenta que el almacenamiento de códigos postales como intlo 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.
Clockwork-Muse

Respuestas:


14

¿MySQL tiene algún soporte para tipos de datos personalizados?

Respuesta simple: no

¿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 función INET_ATON.

Oracle tiene CREATE TYPEalgo similar a una clase OO, que incluye características como funciones miembro y herencia

Postgres tiene CREATE TYPEun 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 el CREATE DOMAINque 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 TYPEque le permite crear un tipo de datos personalizado basado en un tipo de datos del sistema existente. Por ejemplo, podría crear un tipo llamado SSNque se define básicamente como, VARCHAR(11)pero de esta manera no tengo que recordar qué tan grande es un campo.


1
No dude en agregar y editar esta respuesta para que podamos obtener una referencia definitiva. Sentí que la pregunta se presta a una respuesta de CW ...
Jack dice que intente topanswers.xyz

0

Firebird también tiene su solución a través de dominios .

En Firebird, el concepto de un "tipo de datos definido por el usuario" se implementa en forma de dominio. Crear un dominio no crea realmente un nuevo tipo de datos, por supuesto. Un dominio proporciona los medios para encapsular un tipo de datos existente con un conjunto de atributos y hacer que esta "cápsula" esté disponible para uso múltiple en toda la base de datos. Si varias tablas necesitan columnas definidas con atributos idénticos o casi idénticos, un dominio tiene sentido.

El uso del dominio no se limita a las definiciones de columna para tablas y vistas. Los dominios se pueden usar para declarar parámetros y variables de entrada y salida en el código PSQL.


¿Es Firebird MySQL?
Anthony Genovese el

No, Firebird es Firebird :) Acabo de mencionar como otro RDMS que tiene esa característica.
Tibor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.