列 Oracle 到 MySQL 的值超出范围

Posted

技术标签:

【中文标题】列 Oracle 到 MySQL 的值超出范围【英文标题】:Out of range value for column Oracle to MySQL 【发布时间】:2013-03-07 15:31:23 【问题描述】:

我正在将一个庞大的数据库从它的 oracle 数据源同步到一个 mysql 数据源以用于其他目的。在 linux/oracle 数据库中使用 PuTTY 读取数据时,值为

8888888888

这是存储在一个对象中,然后插入到 MySQL 中,然后最终变成

00000000000000000000000000000000000000000000000000000000000000000000008888888888

不幸的是,我现在不是编程英雄,我似乎无法找出问题所在。两个数据库中的数据类型都是 int(10),C# 应用程序不会篡改任何值。这是实际的错误消息:(省略了语句中不相关的部分)

Error while executing query 
INSERT INTO tsdsmd(kode8) 
VALUES ('00000000000000000000000000000000000000000000000000000000000000000000008888888888')
Out of range value for column 'kode8' at row 1

会不会是字符集不匹配?

这是构建插入命令的代码

public int Insert(string table, string[] fields, object[] values)

    if (fields.Length != values.Length)
        throw new DBException("Field lengt is not equal to values length!");

    StringBuilder query = new StringBuilder();
    query.Append("INSERT INTO ");
    query.Append(table);
    query.Append("( ");
    for (int i = 0; i < fields.Length; i++)
    
        query.Append(fields[i]);

        if (i != fields.Length - 1)
        
            query.Append(", ");
        
    

    query.Append(") VALUES (");

    for (int i = 0; i < fields.Length; i++)
    
        query.Append("@" + fields[i]);

        if (i != fields.Length - 1)
        
            query.Append(", ");
        
    

    query.Append(")");

    DBCommand command = new DBCommand(query.ToString());

    for (int i = 0; i < fields.Length; i++)
    
        command.AddParameter("@" + fields[i], values[i]);
    

    return Insert(command);

编辑;我已经更改了一些代码,现在我正在跳过这些行,同时使用单独的 try catch。看看,这就是我所看到的。该值应该在 int 的范围内,我很困惑。潜在的错误?它给我的错误是int对于int32来说太小或太大。不应该是这样。

【问题讨论】:

This is stored into a string 为什么?怎么样? 抱歉把你的帖子弄糊涂了 Davide。我在我的 iPhone 上回复。是否将 0 添加到插入语句中? @Brian 不,他们不是。我添加了创建插入语句的 C# 代码。 @Sebas:Oracle 确实理解数据类型integer(您可以在create table 语句中使用它)。它只是number(22) 的别名:sqlfiddle.com/#!4/60926/1 @a_horse_with_no_name,是的,但是 INT(10) 失败。那是我的观点。整件事就是要指出,腻子提取物是无关紧要的。 【参考方案1】:

在我看来,您可能需要在添加参数时显式转换值。您的代码尝试插入的值是错误的数据类型和零填充,但它在技术上是正确的。如果你这样做,它应该可以解决问题:

command.AddParameter("@" + fields[i], (int)values[i])

诚然,如果您尝试动态处理多种数据类型,这会有点痛苦,但添加一些测试来确定值的正确数据类型应该不会太难。

【讨论】:

奇怪,它声称转换无效。我会进一步调查。 也许尝试显式转换而不是强制转换?我的 c# 技能不是很好,所以我可能做错了。 铸造它似乎不是问题。我正在使用转换、转换和解析,但由于某种原因,它们似乎都返回了前导 000。 问题是 888888888 比 int32 支持的要大。在查询mysql时仍然无法找出为什么它会添加000000000。【参考方案2】:

其实oracle中的列并不像mysql中的“int”那样受int32的限制。必须将 mysql 列转换为 int64/long。

【讨论】:

自我注意:kode8 中的 888888 值显然是伪造的测试数据。感谢数据库管理员。

以上是关于列 Oracle 到 MySQL 的值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 错误 1264:列的值超出范围

MySQL 错误代码:1264。第 1 行的列 'columnname' 的值超出范围

即使没有 datetime 列,也获取“将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值”

MySQL 错误 #167 - 列的值超出范围,即使它是自动递增的

按超出范围的序号列号排序

mysql数据超出范围的处理