从SQL Server转换数据类型到Oracle

3
我目前正在将一个产品从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个回答

3
似乎Oracle的CHAR和VARCHAR2(始终使用VARCHAR2而不是VARCHAR)已经支持Unicode了 - 您链接的文档建议从SQL Server的NCHAR和NVARCHAR数据类型转换为这些数据类型。
实际上,SQL Server的TIMESTAMP根本不是时间戳 - 它是一种基于时间的标识符,仅用于指示行已更改 - 它无法以任何DATETIME的形式转换回来(至少我所知道的方式)。
对于FLOAT,使用126个字节将是巨大的 - 由于开发人员工具自动将SQL Server的FLOAT映射到Oracle的FLOAT(53),为什么不使用那个数量?

SQL Server 的时间戳数据类型列是一种随机类型值,每次更改行时都会自动更改,用于跟踪更改。当您加载数据时,存储此时间戳值,当您返回更新数据时,可以执行 UPDATE... WHERE PK=@PK AND TimestampCol=@PreviousTimestamp。如果没有受影响的行,则表示自从您加载数据以来已被其他人更改。此外,SQL Server 中正在删除时间戳,因为名称令人困惑,它将被 rowversion (Transact-SQL) 替换。 - KM.

0

这更多是提供信息而不是回答你的问题,但你可能会遇到SQL Server和Oracle之间一个特别痛苦的差异。在SQL Server中,你可以定义一个字符串列(无论什么类型)不允许NULL值,然后将零长度(也称为空白)字符串插入到该列中,因为SQL Server不认为空白字符串与NULL相同。

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

  1. 将Oracle中的有问题的字符串列设置为允许NULL值(绝对不是一个好主意)
  2. 在复制数据时,用其他内容替换空白字符串(我不知道你应该在这里使用什么)
  3. 跳过有问题的行并假装你从未看到它们
我很乐意认为Oracle将空字符串视为NULL(在主要的数据库中独树一帜)是为了将客户锁定在他们的平台上,但实际上这种做法正好相反。你可以将一个数据库从Oracle迁移到其他平台,而空白=NULL的差异不会引起任何问题。
请参阅此前的问题:Oracle considers empty strings to be NULL while SQL Server does not - how is this best handled?

谢谢你的警告。我不禁想知道是否还有其他类似破坏性的转换是必需的。 - BeginnerAmongBeginners
1
此外,SQL Server 和 Oracle 在使用空值进行字符串连接时是不同的。在 SQL Server 中,“A”+null 的结果是 null;而在 Oracle 中,“A”||null 的结果是“A”。 - Shannon Severance
Shannon:在Oracle的辩护中(我简直不敢相信我会这么说),你提到的差异至少从我提到的空白=NULL差异中逻辑上是可以理解的。否则,就没有办法将空字符串包含在连接中并获得非空结果了。 - MusiGenesis
@初学者中的初学者:空白=NULL这件事是你真正需要担心的唯一事情。 - MusiGenesis

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接