是否有自定義數據類型之類的東西?
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)
同義詞)同義詞不是我在這裡要問的。
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)
但這樣我就不必記住它有多大。