数据库:有通用的数据类型吗?

Pha*_*nce 6 datatypes sql-standard

在设计数据库表时(使用诸如 Enterprise Architect 之类的工具),当我将来需要切换到不同的数据库时,如何仅使用适用于所有数据库的“通用”数据类型?在切换时,我想避免将新数据库中不可用的列的数据类型更改为新数据库中可用的适当数据类型。

换句话说,是否有任何 ANSI 数据类型可以在具有相同大小的所有数据库中工作?也就是说,类似于“ANSI SQL”,有没有类似“ANSI SQL 数据类型”的东西?

a_h*_*ame 13

对于最基本的数据类型,几乎所有的 DBMS 要么直接支持 ANSI 数据类型,要么至少允许指定它们。

以下声明:

create table products
(
   product_id    integer not null primary key,
   product_name  varchar(100),
   price         decimal(10,2)
);
Run Code Online (Sandbox Code Playgroud)

适用于几乎所有 DBMS。然而,数据类型将被转换为特定于 DBMS 的数据类型(例如,integernumber在 Oracle 中更改为,或更改varcharvarchar2)。

当涉及到更“高级”的数据类型,如 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
  • 整数
  • 十进制
  • DATE(有惊喜:Oracle 有,但包括时间)
  • TIMESTAMP(在 SQL Server 和 MySQL 上做一些与预期不同的事情)

如果您坚持使用这些,那么您几乎是“通用的”,但是当您从一个 DBMS 转到另一个 DBMS 时,其他任何事情都会给您带来一些(令人不快的)惊喜。