O MySQL tem algum suporte para tipos de dados personalizados? Por exemplo, códigos postais podem ser armazenados em um varchar(10)
campo, mas podem ser compactados em um int
, com opções de espaço em branco e um sinalizador se é um código postal de 5 dígitos ou 5+4 dígitos.
Existe uma maneira de instalar tipos de dados contínuos para essas coisas? No caso da aplicação, seria do tipo string, haveria simplesmente truncamento de dados (com ou sem warning), caso a aplicação passasse dados inválidos.
Podem ser usadas funções personalizadas (por exemplo, existe uma função integrada INET_ATON
para endereços IPv4. Mas isso não permite coisas como as zip LIKE '12345%'
que devem ser indexadas adequadamente. Um suporte bem escrito para tipos de dados personalizados permitiria que um tipo de dados fosse marcado como classificável. Portanto, o compact zip int
, quando classificado, seria classificado 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 para 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 de nível de minuto e capacidade além
2038
com menos uso de armazenamento do quedatetime
, mas sem necessidade de oferecer suporte a datas anteriores ao ano de implementação (digamos que o mínimo possa ser 2007 se essas forem as datas mais antigas no sistema) - Timestamps que implementam DST (que não parecem existir )
- O estado de duas letras dos EUA pode ser armazenado em um único byte
- long
ENUM
s podem ser separados em um tipo de dados personalizado para queDESCRIBE
a saída de 's não seja tão confusa com todo o empacotamento.
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, exceto para fazer o aplicativo chamar uma função como a INET_ATON
função.
MS SQL parece ter algo dessa natureza , mas 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.
Resposta simples: não
O Oracle tem
CREATE TYPE
algo análogo até certo ponto a uma classe OO, incluindo recursos como funções de membro e herançaO Postgres tem
CREATE TYPE
um pouco menos de classes OO (sem funções de membro ou herança), mas são incrivelmente flexíveis e úteis, permitindo até mesmo a criação de novos tipos básicos. Existe tambémCREATE DOMAIN
o que permite uma forma de herança ou subtipagem e basicamente estende um tipo base com algumas restrições. O Postgres também tem alguns tipos básicos interessantes por padrão, por exemplo, tipos inet e geométricos . No Postgres, pode-se 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
CREATE TYPE
permite que você crie um tipo de dados personalizado com base em um tipo de dados do sistema existente. Por exemplo, eu poderia criar um tipo chamadoSSN
que é basicamente definido como,VARCHAR(11)
mas dessa forma não preciso me lembrar do tamanho do campo.O Firebird também tem sua solução via domínios .