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_ATON
interna 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,
2038
com menos uso de armazenamentodatetime
, 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
ENUM
s longos podem ser separados em um tipo de dados personalizado, para queDESCRIBE
a 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_ATON
função.
O MS SQL parece ter algo dessa natureza , mas eu gostaria de saber se é mais do que apenas um sinônimo. (por exemplo, boolean
poderia ser um sinônimo para tinyint(1)
, ou postal_code
para um de char
ou varchar
(5
ou 9
ou 10)
) Sinônimos não são o que estou perguntando aqui.
fonte
IPv6
em umbinary(16)
, ou é limitado a aliasing (que poderia ser usado parastate
s tornando-seenum
s)int
vontade 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.Respostas:
Resposta simples: não
O Oracle possui o
CREATE TYPE
que é análogo a uma classe OO, incluindo recursos como funções-membro e herançaO Postgres possui
CREATE TYPE
um 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 umCREATE DOMAIN
que 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 TYPE
que permite criar um tipo de dados personalizado com base em um tipo de dados do sistema existente. Por exemplo, eu poderia criar um tipo chamadoSSN
basicamente definido como,VARCHAR(11)
mas dessa forma não preciso me lembrar de quão grande é um campo.fonte
O Firebird também possui sua solução através de domínios .
fonte