4

我的 Oracle 数据库返回错误:

ORA-12899 - 列 TIT.ESTADO_CIVIL 的值太大(实际值:2,最大值:1)

但我很确定发送的值是一个唯一的字符'C'。

任何人都知道为什么会这样?

(我在 ODP.NET 中使用 C#)

4

2 回答 2

5

“C# char 有 16 位;谷歌搜索告诉我 Oracle CHAR 类型是 8 位。”

有几种方法可以解决这个问题。最好的解决方案是修复数据库,使其使用字符语义。

alter system set nls_length_semantics = char
/ 

由于这会产生重大影响,因此您需要确保它可以解决您的问题。修改您的表以使用字符语义并查看它是否删除了 ORA-12899 异常。

SQL> create table t69 (col1 char(1 byte))
  2  /

Table created.

SQL> desc t69
 Name          Null?    Type
 ------------- -------- ----------------
 COL1                   CHAR(1)


SQL> alter table t69 modify col1 char(1 char)
  2  /

Table altered.

SQL> desc t69
 Name          Null?    Type
 ------------- -------- ----------------
 COL1                   CHAR(1 CHAR)

SQL>

该文档有很多关于全球化和字符集的有用信息。你没有说你正在使用哪个版本的数据库,所以这里是Length Semantics 上的 9i 文档的链接。

于 2010-05-02T15:27:48.220 回答
0

根据公认的答案,在数据库级别修复似乎是最好的主意 - 因为它避免了任何令人惊讶的行为。

但是,如果您不想在数据库级别修复(或无法访问),我可以通过两种方法来完成此操作。我不确定第二个,但想分享它以防有人发现它有用/可以解释它。

我的问题

  • Oracle存储过程接受类型的输入参数,char (1 byte)用于设置char (1 byte)列的值
  • 我正在使用System.Data.OracleClient.OracleCommand

    IDbDataParameter parm = command.CreateParameter();
    parm.ParameterName = "myname";
    parm.ParameterValue = 'A'; // a C# (16 bit) char
    

这触及了value too large for column原始海报提到的错误。

解决方案 1

设置值后覆盖OracleType手动:

((OracleParameter)parm).OracleType = OracleType.Char;

解决方案 2

稍微狡猾 - 只需使用一个字符串(我不明白为什么会这样,所以要警惕依赖它):

parm.ParameterValue = "A"; // "A" instead of 'A'
于 2017-03-28T14:08:17.030 回答