【问题标题】:Data Type Conversion from SQL Server to Oracle从 SQL Server 到 Oracle 的数据类型转换
【发布时间】:2010-05-07 14:38:42
【问题描述】:

我目前正在将产品从 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)

时间戳 -> 数字

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 件事,将不胜感激。

提前致谢。

【问题讨论】:

    标签: sql-server database oracle


    【解决方案1】:

    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)
    【解决方案2】:

    这更像是仅供参考,而不是回答您的问题,但您可能会遇到 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?

    【讨论】:

    • 感谢您的警告。我不禁想知道是否还需要其他类似的破坏性转换。
    • 此外,在 SQL Server 和 Oracle 之间,字符串与 null 的连接是不同的。 SQL Server 'A' + null 产生 null,Oracle 'A' || null 产生“A”。
    • Shannon:在甲骨文的辩护中(我不敢相信我这么说),你提到的差异至少从逻辑上遵循我提到的空白=NULL 差异。否则,将无法在连接中包含空白字符串并返回非空结果。
    • @BeginnerAmongBeginners:blank=NULL 是您真正需要担心的唯一事情。
    【解决方案3】:

    以下不是您问题的直接答案;不过去sqlteam博客看看就好了

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

    详细解释了numbers等的处理方式

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 2020-04-04
      • 2019-03-08
      • 2015-05-19
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多