Does MySQL have any support for custom data types? For example, zip codes might be stored in a varchar(10)
field, but they could be compacted in to an int
, with options for blank, and a flag as to whether it is a 5 digit or 5+4 digit zip code.
Is there a way to install seamless data types for such things? As far as the application is concerned, it would be a string type, there would simply be data truncation (with or without warning), if the application passed invalid data.
Custom functions could be used (for example, there is a built in function INET_ATON
for IPv4 addresses. But that does not allow for such things as zip LIKE '12345%'
which should be properly indexed. A well written support for custom data types would allow a data type to be marked as sortable. So the compact zip int
, when sorted, would sort just as if it was a zip varchar(10)
.
This would allow for the column to be fixed width, it would allow 6 or 10 byte variable storage to be cut down to 4 byes of fixed width.
There are several applicable uses
- Zip Codes
- IPv6 addresses
- Custom timestamp fields with minute level precision and capacity beyond
2038
with less storage usage thandatetime
, but no need to support dates before the year of implementation (say the min could be 2007 if those are the oldest dates in the system) - Timestamps that implement DST (which don't seem to exist)
- Two letter US state can be stored in a single byte
- long
ENUM
s can be separated into a custom data type so thatDESCRIBE
's output would not be so messy looking with all the wrapping.
I expect the data type handlers would be stored similar to the way functions are stored.
Is there anything remotely like this on any database engine? I mostly use MySQL, but I am curious if this has ever been implemented, short of making the application call a function like the INET_ATON
function.
MS SQL does seem to have something of that nature, but I would like to know if it is more than just a synonym. (for example boolean
could be a synonym for tinyint(1)
, or postal_code
for one of char
or varchar
(5
or 9
or 10)
) Synonyms are not what I am asking about here.
2 Answers 2
Does MySQL have any support for custom data types?
Simple answer: no
Is there anything remotely like this on any database engine? I mostly use MySQL, but I am curious if this has ever been implemented, short of making the application call a function like the INET_ATON function.
Oracle has CREATE TYPE
which is analogous to some degree to a OO class, including features like member functions and inheritance
Postgres has CREATE TYPE
which is a bit less like OO classes (no member functions or inheritance) but are incredibly flexible and useful, even allowing you to create new base types. There is also CREATE DOMAIN
which allows a form of inheritance or sub-typing and basically extends a base type with some constraints. Postgres also has quite a few interesting base types by default, eg inet and geometric types. In Postgres one can write an extension in C for a custom datatype, such as in this example here with base36 data type.
SQL Server has CREATE TYPE
which allows you to create a custom data type based on an existing system data type. For example I could create a type called SSN
which is basically defined as VARCHAR(11)
but this way I don't have to remember how big a field it is.
-
1Please feel free to pile in and edit this answer so we can get a definitive reference. I felt the question lends itself to a CW answer...Jack Douglas– Jack Douglas2011年08月26日 18:11:15 +00:00Commented Aug 26, 2011 at 18:11
Firebird also has it's solution via domains.
In Firebird, the concept of a "user-defined data type" is implemented in the form of the domain. Creating a domain does not truly create a new data type, of course. A domain provides the means to encapsulate an existing data type with a set of attributes and make this "capsule" available for multiple usage across the whole database. If several tables need columns defined with identical or nearly identical attributes, a domain makes sense.
Domain usage is not limited to column definitions for tables and views. Domains can be used to declare input and output parameters and variables in PSQL code.
-
Is Firebird MySQL?Anthony Genovese– Anthony Genovese2019年08月07日 19:08:06 +00:00Commented Aug 7, 2019 at 19:08
-
1No, Firebird is Firebird :) I just mentioned as nother RDMS that has such a feature.Tibor– Tibor2019年08月25日 03:08:37 +00:00Commented Aug 25, 2019 at 3:08
IPv6
into abinary(16)
, or is it limited to aliasing (which could be used forstate
s becomingenum
s)int
will not work for an internationalized database - Canada, for example, uses the format of 'A9A A9A'. Creating a custom data-type for zip-codes is probably a good idea; however, you may wish to re-examine how you are planning on dealing with some of them (storing the state in a single-byte field has potential 'other' issues, for example). And don't re-implement date/time datatypes, unless the provided ones are un-usuably deficient (size doesn't count) - you'll just confuse people.