我的 Oracle 数据库返回错误:
ORA-12899 - 列 TIT.ESTADO_CIVIL 的值太大(实际值:2,最大值:1)
但我很确定发送的值是一个唯一的字符'C'。
任何人都知道为什么会这样?
(我在 ODP.NET 中使用 C#)
“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 文档的链接。
根据公认的答案,在数据库级别修复似乎是最好的主意 - 因为它避免了任何令人惊讶的行为。
但是,如果您不想在数据库级别修复(或无法访问),我可以通过两种方法来完成此操作。我不确定第二个,但想分享它以防有人发现它有用/可以解释它。
我的问题
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'