是否有“自定义数据类型”之类的东西?


14

MySQL是否支持自定义数据类型?例如,邮政编码可以存储在一个varchar(10)字段中,但可以压缩为一个int,其中带有空白选项,并带有一个有关5位或5 + 4位邮政编码的标志。

有没有办法为这些事情安装无缝数据类型?就应用程序而言,它将是字符串类型,如果应用程序传递了无效数据,则将只是数据截断(带有或不带有警告)。

可以使用自定义函数(例如,有一个INET_ATON用于IPv4地址的内置函数。但这不允许zip LIKE '12345%'进行正确索引的事情。对自定义数据类型的良好书写支持将允许标记数据类型因此,紧凑型zip int在排序时会像是一样进行排序zip varchar(10)

这将允许该列为固定宽度,这将允许将6或10字节的变量存储空间缩减为4 byby固定宽度。

有几种适用的用途

  • 邮递区号
  • IPv6地址
  • 自定义时间戳字段,具有分钟级别的精度和容量2038,且存储使用量少于datetime,但无需支持实施年份之前的日期(例如,如果这些日期是系统中最早的日期,则最小值可以是2007年)
  • 实现DST的时间戳(似乎不存在
  • 两个字母的美国状态可以存储在一个字节中
  • ENUM可以将long s分隔为自定义数据类型,这样,DESCRIBE在所有包装中,输出都不会显得那么混乱。

我希望数据类型处理程序的存储方式类似于函数的存储方式。

任何数据库引擎上是否都存在类似的远程功能?我主要使用MySQL,但是我很好奇它是否曾经实现过,没有让应用程序调用类似于INET_ATON函数的函数。

MS SQL确实具有这种性质,但是我想知道它是否仅仅是同义词。(例如,boolean可以是tinyint(1)或或或或postal_code之一的同义词)同义词不是我要问的。charvarchar (5910)


mysql的简单答案afaik:不。看看其他RDBMS如何处理这些事情将很有趣
Derek Downey

@DTest:SQL Server中具有CREATE TYPE:现在对CLR类型有用。msdn.microsoft.com/zh-CN/library/ms175007(SQL.90).aspx
gbn

1
@George Bailey:您的SQL Server链接已过期:适用于SQL Server2000。有关MySQL的信息,请参见stackoverflow.com/q/2451435/27535
gbn

@gbn,(回应第一个评论)是否包含类型翻译,例如将IPv6a 转换为a binary(16),还是仅限于别名(可用于states变成enums)
Bryan Field,

1
请注意,存储压缩码作为int不会为国际化数据库的工作-加拿大,例如,使用“A9A A9A”的格式。为邮政编码创建一个自定义数据类型可能是一个好主意。但是,您可能希望重新检查计划如何处理其中的一些问题(例如,将状态存储在单字节字段中可能会出现“其他”问题)。并且不要重新实现日期/时间数据类型,除非提供的数据类型异常不足(大小不计算在内),否则只会使人们感到困惑。
Clockwork-Muse

Answers:


14

MySQL是否支持自定义数据类型?

简单答案:否

任何数据库引擎上是否有类似远程的东西?我主要使用MySQL,但是我很好奇它是否曾经实现过,没有让应用程序调用类似INET_ATON函数的函数。

Oracle在CREATE TYPE某种程度上类似于OO类,包括诸如成员函数和继承之类的功能。

Postgres CREATE TYPE有点不像OO类(没有成员函数或继承),但具有极大的灵活性和实用性,甚至允许您创建新的基本类型。还有一种CREATE DOMAIN允许继承或子类型的形式,并且基本上扩展了具有某些约束的基本类型。默认情况下,Postgres也有很多有趣的基本类型,例如inet几何类型。在Postgres中,可以用C编写自定义数据类型的扩展名,例如在本示例中使用base36数据类型

SQL Server具有CREATE TYPE允许您基于现有系统数据类型创建自定义数据类型的功能。例如,我可以创建一个SSN基本定义为的类型,VARCHAR(11)但是通过这种方式,我不必记住它的大小。


1
请随时加入并编辑此答案,以便我们获得明确的参考。我觉得这个问题很适合解决CW问题……
杰克说,请尝试topanswers.xyz 2011年

0

Firebird也可以通过domains解决方案。

在Firebird中,“用户定义的数据类型”的概念以域的形式实现。当然,创建域并不能真正创建新的数据类型。域提供了一种方法来封装具有一组属性的现有数据类型,并使该“胶囊”可用于整个数据库的多种用途。如果几个表需要用相同或几乎相同的属性定义的列,则可以使用一个域。

域的使用不限于表和视图的列定义。域可用于在PSQL代码中声明输入和输出参数以及变量。


是Firebird MySQL吗?
Anthony Genovese

不,Firebird是Firebird :)我刚刚提到了具有这种功能的RDMS。
Tibor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.