我目前正在将产品从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个问题,我们将不胜感激。
提前致谢。
答案 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中的对应表时,这显然会导致问题。你可以选择处理这个问题:
我很乐意认为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
等等。