数据类型从SQL Server到Oracle的转换

时间:2010-05-07 14:38:42

标签: sql-server database oracle

我目前正在将产品从SQL Server迁移到Oracle。我对SQL Server不太熟悉,对Oracle一无所知,所以如果仅仅存在这个问题,我会道歉。

从此页面http://download.oracle.com/docs/cd/E12151_01/doc.150/e12156/ss_oracle_compared.htm推断,似乎从SQL Server到Oracle的数据类型转换应该是:

REAL = FLOAT(24) - > FLOAT(63)

FLOAT(p) - > FLOAT(p)的

TIMESTAMP - > NUMBER

NVARCHAR(n) - > VARCHAR(N * 2)

NCHAR(n) - > CHAR(N * 2)

以下是关于他们的问题:

对于FLOAT,考虑到FLOAT(p) - > FLOAT(p),它不也意味着FLOAT - > FLOAT(24)

对于TIMESTAMP,由于Oracle也有自己的版本,因此TIMESTAMP - >会不会更好。 TIMESTAMP?

最后,对于NVARCHAR(n)和NCHAR(n),我认为问题与Unicode有关。然后,再次,由于Oracle提供了它自己的版本,因此NVARCHAR(n) - >会更有意义吗? NVARCHAR(n)和NCHAR(n) - > NCHAR(n)的

如果有人要详细说明之前的3个问题,我们将不胜感激。

提前致谢。

3 个答案:

答案 0 :(得分:2)

似乎Oracle的CHAR和VARCHAR2(始终使用VARCHAR2而不是VARCHAR)已经支持Unicode - 您链接的文档建议转换为SQL Server NCHAR和NVARCHAR数据类型的文档。

SQL Server TIMESTAMP实际上根本不是时间戳 - 它是基于刚刚用于指示行已更改的时间的某种标识符 - 它无法转换回任何类型的DATETIME(在至少以我所知道的方式。)

对于FLOAT,使用126个字节将是巨大的 - 因为开发人员工具自动将SQL Server的FLOAT映射到Oracle的FLOAT(53),为什么不使用该数量呢?

答案 1 :(得分:0)

这比您的问题的答案更为明确,但您可能会在SQL Server和Oracle之间遇到特别痛苦的差异。在SQL Server中,您可以定义一个字符串列(任何风格)以不允许NULL值,然后将零长度(也称为“空白”)字符串插入该列,因为SQL Server不认为空字符串是与NULL相同。

Oracle 认为空字符串与NULL相同,因此Oracle不允许您将空值插入NOT NULL列。当将数据从SQL Server中的表复制到Oracle中的对应表时,这显然会导致问题。你可以选择处理这个问题:

  1. 在Oracle中设置违规字符串列以允许NULL值(所以不是一个好主意)
  2. 复制数据时,用别的东西替换空白字符串(我不知道你应该在这里使用什么)
  3. 跳过有问题的行并假装你从未见过它们
  4. 我很乐意认为Oracle选择空字符串为NULL(在主要数据库中只有它们)的选择是将客户锁定在他们的平台上,但这个实际上是在相反的方向。您可以将数据库从Oracle移动到其他位置而不会出现blank = NULL差异,从而导致任何问题。

    请参阅此前一个问题:Oracle considers empty strings to be NULL while SQL Server does not - how is this best handled?

答案 2 :(得分:0)

以下不是您问题的直接答案;但是看看sqlteam博客

是件好事

sqlteam - Datatypes translation between Oracle and SQL Server part 2: number

它详细解释了如何处理numbers等等。