我的Oracle數據庫返回錯誤:ORA-12899錯誤CHAR(1)字段,但我只發送一個「C」
ORA-12899 - Value too large for column TIT.ESTADO_CIVIL (actual: 2, maximum: 1)
但我很肯定的sended值是獨特的'C'字符。
任何人都知道爲什麼會發生這種情況?
(我使用C#與ODP.NET)
我的Oracle數據庫返回錯誤:ORA-12899錯誤CHAR(1)字段,但我只發送一個「C」
ORA-12899 - Value too large for column TIT.ESTADO_CIVIL (actual: 2, maximum: 1)
但我很肯定的sended值是獨特的'C'字符。
任何人都知道爲什麼會發生這種情況?
(我使用C#與ODP.NET)
"The C# char has 16 bits; googling tells me that Oracle CHAR types are 8 bits."
有一對夫婦的處理這個問題的方式。最好的解決方案是修復數據庫,使其使用字符語義。
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>
該文檔有很多關於全球化和字符集的有用信息。你不會說你正在使用哪個版本的數據庫,所以這裏有一個到the 9i docs on Length Semantics的鏈接。
根據公認的答案,修復數據庫級別似乎是最好的主意 - 因爲它避免了任何令人驚訝的行爲。
但是,如果您不想在數據庫級別修復(或無法訪問),有兩種方法可以讓我工作。我不確定第二個,但想分享它,以防有人發現它有用/可以解釋它。
我的問題
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
This hit the value too large for column
原始海報提及的錯誤。
解決方案1
覆蓋的OracleType
手動設定值後:
((OracleParameter)parm).OracleType = OracleType.Char;
解決方案2
略多狡猾的 - 只需使用一個字符串(我不理解爲什麼這個工程,所以會依靠它的謹慎):
parm.ParameterValue = "A"; // "A" instead of 'A'
有沒有可能實際發送一個多字節的Unicode字符? – APC 2010-05-02 14:48:22
C#字符有16位;谷歌搜索告訴我,Oracle的CHAR類型是8位。 – 2010-05-02 14:51:32