MySQL 是否支持自定义数据类型?例如,邮政编码可能存储在一个varchar(10)
字段中,但它们可以压缩成一个int
,带有空白选项,以及一个关于它是 5 位还是 5+4 位邮政编码的标志。
有没有办法为这些东西安装无缝数据类型?就应用程序而言,它将是一个字符串类型,如果应用程序传递了无效数据,则只会出现数据截断(有或没有警告)。
可以使用自定义函数(例如,有一个INET_ATON
用于 IPv4 地址的内置函数。但这不允许对zip LIKE '12345%'
哪些内容进行正确索引。编写良好的自定义数据类型支持将允许标记数据类型作为可排序的。因此,紧凑的zip int
排序时,将排序就像它是一个zip varchar(10)
.
这将允许列固定宽度,它将允许 6 或 10 字节的变量存储减少到 4 字节的固定宽度。
有几种适用的用途
- 邮政编码
- IPv6 地址
- 具有分钟级别精度和容量的自定义时间戳字段,
2038
存储使用量少于datetime
,但不需要支持实施年份之前的日期(例如,如果这些日期是系统中最旧的日期,则最小值可能是 2007 年) - 实现 DST 的时间戳(似乎不存在)
- 两个字母的美国州可以存储在一个字节中
- long
ENUM
s 可以被分离成一个自定义的数据类型,这样DESCRIBE
's 的输出就不会因为所有的包装而显得那么凌乱。
我希望数据类型处理程序的存储方式类似于函数的存储方式。
在任何数据库引擎上都有这样的远程吗?我主要使用 MySQL,但我很好奇这是否曾经实现过,没有让应用程序调用像函数这样的INET_ATON
函数。
MS SQL 似乎确实具有这种性质,但我想知道它是否不仅仅是同义词。(例如boolean
,可能是 的同义词tinyint(1)
,或者postal_code
是char
orvarchar
(5
或9
or之一的10)
同义词)同义词不是我在这里要问的。
简单的回答:没有
Oracle 具有
CREATE TYPE
在某种程度上类似于 OO 类,包括成员函数和继承等特性Postgres
CREATE TYPE
有点不像 OO 类(没有成员函数或继承),但非常灵活和有用,甚至允许您创建新的基本类型。还有一种CREATE DOMAIN
允许继承或子类型的形式,并且基本上扩展了具有一些约束的基本类型。默认情况下,Postgres 也有很多有趣的基本类型,例如inet和几何类型。在 Postgres 中,可以为自定义数据类型编写 C 扩展,例如在此示例中使用base36 数据类型。SQL Server
CREATE TYPE
允许您基于现有系统数据类型创建自定义数据类型。例如,我可以创建一个名为的类型SSN
,该类型基本上定义为,VARCHAR(11)
但这样我就不必记住它有多大。Firebird也有它的解决方案domain。