Datatypes
數據庫:有通用數據類型嗎?
在設計數據庫表時(使用 Enterprise Architect 等工具),當我將來需要切換到不同的數據庫時,如何只使用適用於所有數據庫的“通用”數據類型?在切換時,我想避免將新數據庫中不可用的列的數據類型更改為新數據庫中可用的適當數據類型。
換句話說,是否有任何 ANSI 數據類型可以在所有具有相同大小的數據庫中工作?也就是類似於“ANSI SQL”,有沒有類似於“ANSI SQL 數據類型”的東西?
對於最基本的數據類型,幾乎所有 DBMS 要麼直接支持 ANSI 數據類型,要麼至少允許指定它們。
以下聲明:
create table products ( product_id integer not null primary key, product_name varchar(100), price decimal(10,2) );
幾乎適用於所有 DBMS。然而,數據類型將被轉換為特定於 DBMS 的類型(例如
integer
,將number
在 Oracle 中更改為 或varchar
)varchar2
。當涉及到更“高級”的數據類型,如 CLOB、BLOB、XML、Json 或地理空間類型時,這不再適用(CLOB、BLOB 很常見,但例如不被 Postgres 理解,儘管您可以輕鬆地創建一個域或具有該名稱的使用者數據類型以使其更兼容)。
ANSI 標准定義的基本數據類型有:
- 特點
- CHARACTER VARYING(或 VARCHAR)
- 字元大對象
- NCHAR
- NCHAR 變化
- 二進制
- 二進制變化
- 二進制大對象
- 數字
- 十進制
- 小靈通
- 整數
- 大整數
- 漂浮
- 真實的
- 雙精度
- 布爾值
- 日期
- 時間
- 時間戳
- 間隔
並非所有 DBMS 都支持所有這些(MySQL 沒有區間數據類型,MySQL 和 SQL Server 沒有真正的布爾類型,Oracle 根本沒有布爾類型或真正的 DATE 或 TIME 數據類型,Postgres沒有
nchar
-該列表可以繼續進行)。但最常見的通常工作得很好。根據我的經驗,以下那些在不同的 DBMS 上都沒有(主要)問題(儘管這是我的經驗 - 這不是一個完整或明確的列表!)
- VARCHAR
- 整數
- 十進制
- 日期(令人驚訝:Oracle 有,但包括時間)
- TIMESTAMP(在 SQL Server 和 MySQL 上做的事情與預期不同)
如果你堅持這些,你幾乎是“普遍的”,但是當你從一個 DBMS 轉到另一個時,其他任何事情都會給你一些(不愉快的)驚喜。