Existem tipos de dados personalizados?

14

O MySQL tem suporte para tipos de dados personalizados? Por exemplo, os códigos postais podem ser armazenados em um varchar(10)campo, mas podem ser compactados em um int, com opções para em branco e um sinalizador para saber se é um código postal de 5 ou 5 + 4 dígitos.

Existe uma maneira de instalar tipos de dados contínuos para essas coisas? No que diz respeito à aplicação, seria um tipo de string, haveria simplesmente truncamento de dados (com ou sem aviso), se a aplicação passasse dados inválidos.

Funções personalizadas podem ser usadas (por exemplo, existe uma função INET_ATONinterna para endereços IPv4. Mas isso não permite coisas zip LIKE '12345%'que devem ser indexadas corretamente. Um suporte bem escrito para tipos de dados personalizados permitiria que um tipo de dados fosse marcado Assim, o compacto zip int, quando classificado, classificaria como se fosse um zip varchar(10).

Isso permitiria que a coluna tivesse largura fixa, permitiria que o armazenamento variável de 6 ou 10 bytes fosse reduzido a 4 bytes de largura fixa.

Existem vários usos aplicáveis

  • CEP
  • Endereços IPv6
  • Campos de carimbo de data / hora personalizados com precisão e capacidade em nível de minuto além, 2038com menos uso de armazenamento datetime, mas não há necessidade de oferecer suporte a datas antes do ano de implementação (digamos que o mínimo poderia ser 2007 se essas forem as datas mais antigas do sistema)
  • Carimbos de data e hora que implementam o horário de verão (que parecem não existir )
  • O estado americano de duas letras pode ser armazenado em um único byte
  • ENUMs longos podem ser separados em um tipo de dados personalizado, para que DESCRIBEa saída não seja tão confusa com todo o agrupamento.

Espero que os manipuladores de tipo de dados sejam armazenados de maneira semelhante à maneira como as funções são armazenadas.

Existe algo remotamente parecido com isso em qualquer mecanismo de banco de dados? Eu uso principalmente o MySQL, mas estou curioso para saber se isso já foi implementado, menos que o aplicativo chame uma função como a INET_ATONfunção.

O MS SQL parece ter algo dessa natureza , mas eu gostaria de saber se é mais do que apenas um sinônimo. (por exemplo, booleanpoderia ser um sinônimo para tinyint(1), ou postal_codepara um de charou varchar (5ou 9ou 10)) Sinônimos não são o que estou perguntando aqui.

Bryan Field
fonte
resposta simples afaik para mysql: não. Seria interessante ver como os outros RDBMS lidam com essas coisas
Derek Downey
@DTest: você tem CREATE TYPE no SQL Server: útil para os tipos CLR agora. msdn.microsoft.com/pt-br/library/ms175007(SQL.90).aspx
gbn
1
@ George Bailey: seu link do SQL Server está desatualizado: é para o SQL Server 2000. E para o MySQL, veja stackoverflow.com/q/2451435/27535
gbn
@gbn, (resposta ao primeiro comentário) é o tipo de tradução incluída, vai converter por exemplo, um IPv6em um binary(16), ou é limitado a aliasing (que poderia ser usado para states tornando-se enums)
Bryan Campo
1
Por favor, esteja ciente de que o armazenamento de zip códigos como uma intvontade não trabalho para um banco de dados internacionalizada - Canadá, por exemplo, usa o formato de 'A9A A9A'. Criar um tipo de dados personalizado para CEPs provavelmente é uma boa idéia; no entanto, você pode reexaminar como planeja lidar com alguns deles (o armazenamento do estado em um campo de byte único tem possíveis outros problemas, por exemplo). E não reimplemente tipos de dados de data / hora, a menos que os fornecidos sejam inadequadamente inadequados (o tamanho não conta) - você apenas confundirá as pessoas.
Clockwork-Muse

Respostas:

14

O MySQL tem suporte para tipos de dados personalizados?

Resposta simples: não

Existe algo remotamente parecido com isso em qualquer mecanismo de banco de dados? Eu uso principalmente o MySQL, mas estou curioso para saber se isso já foi implementado, menos que o aplicativo chame uma função como a função INET_ATON.

O Oracle possui o CREATE TYPEque é análogo a uma classe OO, incluindo recursos como funções-membro e herança

O Postgres possui CREATE TYPEum pouco menos do que as classes OO (sem funções-membro ou herança), mas são incrivelmente flexíveis e úteis, permitindo até que você crie novos tipos de base. Também existe um CREATE DOMAINque permite uma forma de herança ou sub-digitação e basicamente estende um tipo de base com algumas restrições. O Postgres também possui vários tipos de base interessantes por padrão, por exemplo, tipos inet e geométricos . No Postgres, é possível escrever uma extensão em C para um tipo de dados personalizado, como neste exemplo aqui, com o tipo de dados base36 .

O SQL Server possui o CREATE TYPEque permite criar um tipo de dados personalizado com base em um tipo de dados do sistema existente. Por exemplo, eu poderia criar um tipo chamado SSNbasicamente definido como, VARCHAR(11)mas dessa forma não preciso me lembrar de quão grande é um campo.

Jack Douglas
fonte
1
Sinta-se à vontade para agrupar e editar esta resposta para que possamos obter uma referência definitiva. Senti a questão se presta a uma resposta CW ...
Jack diz tentativa topanswers.xyz
0

O Firebird também possui sua solução através de domínios .

No Firebird, o conceito de um "tipo de dados definido pelo usuário" é implementado na forma do domínio. Criar um domínio não cria verdadeiramente um novo tipo de dados, é claro. Um domínio fornece os meios para encapsular um tipo de dados existente com um conjunto de atributos e disponibilizar essa "cápsula" para uso múltiplo em todo o banco de dados. Se várias tabelas precisarem de colunas definidas com atributos idênticos ou quase idênticos, um domínio fará sentido.

O uso do domínio não se limita às definições de coluna para tabelas e visualizações. Os domínios podem ser usados ​​para declarar parâmetros e variáveis ​​de entrada e saída no código PSQL.

Tibor
fonte
O Firebird é MySQL?
Anthony Genovese
Não, o Firebird é o Firebird :) Acabei de mencionar como outro RDMS que possui esse recurso.
Tibor