2010-05-02 28 views
4

我的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)

+1

有沒有可能實際發送一個多字節的Unicode字符? – APC 2010-05-02 14:48:22

+0

C#字符有16位;谷歌搜索告訴我,Oracle的CHAR類型是8位。 – 2010-05-02 14:51:32

回答

5

"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的鏈接。

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 
    

This hit the value too large for column原始海報提及的錯誤。

解決方案1 ​​

覆蓋的OracleType手動設定值後:

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

解決方案2

略多狡猾的 - 只需使用一個字符串(我不理解爲什麼這個工程,所以會依靠它的謹慎):

parm.ParameterValue = "A"; // "A" instead of 'A'