2012-10-23 40 views
0

有数据库表fsr_system_log的架构fsr_applmessage的规模有限。该表应该存储系统日志消息。柱的大小是255和数据类型是varchar2。用于保存信息的大小实现的逻辑是超过255个字符是:数据不被保存在数据库中,由于现场

public void saveSystemLog(SystemLogRequest systemLog){ 
    User user = systemLog.getUser(); 
    String system = systemLog.getSystem(); 
    Log log = systemLog.getSystemLog(); 

    try { 
     initializeDelegate(); 
     delegate.beginTransaction(); 

     LogEntry[] logEntries = log.getItemArray(); 
     for (LogEntry logEntry : logEntries) { 
      // Save each entry 
      ParamVector<Object> params = new ParamVector<Object>(); 

      //Check if message is greater than 255 characters 
      String message = logEntry.getMsg(); 
      notifier.debug("Log Message is : " + message); 
      if(message.length()>255){ 
       message = message.substring(0,255); 
       notifier().debug("Message string greater than 255 characters : " + message); 
      } 
      params.add(message, 255, false); 
} 

但是,尽管实施代码,我面对以下错误:

Failed to save system log due to SQL error: ORA-12899: value too large for column "FSR_APPL". "FSR_SYSTEM_LOG". "MESSAGE" (actual: 257, maximum: 255)

正在使用的示例日志是:

<xbe:systemLogRequest xmlns:xbe="http://tdc.dk/fsr/common/xbean"> 
<user> 
    <userNumber>a62267</userNumber> 
</user> 
<system>Client</system> 
<systemLog> 
    <item> 
     <timestamp>2011-10-27T17:03:08.404+02:00</timestamp> 
     <type>Info</type> 
     <msg><![CDATA[<html><center>Din registrering er nu sendt<br><br>Tak for indmeldingen</center></html>]]></msg> 
    </item> 
    <item> 
     <timestamp>2011-10-27T17:03:13.701+02:00</timestamp> 
     <type>Info</type> 
     <msg><![CDATA[<html><center>Din registrering er nu sendt<br><br>Tak for indmeldingen</center></html>]]></msg> 
    </item> 
    <item> 
     <timestamp>2011-10-28T12:45:47.801+02:00</timestamp> 
     <type>Info</type> 
     <msg><![CDATA[<html><center>Din registrering er nu sendt<br><br>Tak for indmeldingen</center></html>]]></msg> 
    </item> 
    <item> 
     <timestamp>2011-10-28T12:45:57.926+02:00</timestamp> 
     <type>Info</type> 
     <msg>Afsluttet uden at gemme fejlregistering</msg> 
    </item> 
</systemLog> 
</xbe:systemLogRequest> 

请帮帮忙!

注:抛出的错误是仅针对特定的系统日志消息。当抛出这个错误时,实际值总是257。

+1

你使用Java?它看起来像你,但它可能是另一种语言。这可能是一个Java问题。可能有非ASCII字符以UTF-8表示为多字节字符。如果是这样,做一个子字符串到255个字符将超过255个字节。调用子字符串结果的getBytes,并获取字节数组的大小。 –

+0

@MarlinPierce是的..我使用JAVA。如果使用子字符串不会有帮助,那么我们有什么替代方法? – San

回答

0

你可以改变你的字段类型为CLOB,BLOB或XMLType的。查询Oracle数据类型,VARCHAR2似乎也可以处理字节。

你也许可以理解,也不想改变你的字段类型,在这种情况下,更换

if(message.length()>255){ 
    message = message.substring(0,255); 
    notifier().debug("Message string greater than 255 characters : " + message); 
} 

pos = 255 
while (message.getBytes().size() > 255) { 
    message = message.substring(0,pos--); 
} 
+0

为什么我应该使用while循环?不会简单地使用“if”条件工作正常吗? – San

+0

好吧,现在你只有一个多字节字符,并且大小始终是257.但是如果以后你有两个多字节字符呢?另外,除非多字节字符是最后一个字符,否则您可能需要将两个单字节字符从长度257删除到255。 –

0

乍一看,我怀疑的编码问题...

的Java使用Unicode:为Unicode字符可以花费一到许多字节(S)... Java字符串的长度是1,但对存储编组时,可以采取2个字节,4字节......

要检查的字节长度,也许你应该尝试:

if(message.getBytes("US-ASCII").length()>255){ 

什么是你的Oracle数据库的编码?

另一个可能的问题是,写入DB类增加了CR/LF(0D0A)的msg参数或其他什么东西......

1

显然,你有一些字符与一个以上的字节表示。

在Java中,你得到的字符串的长度字符而Oracle显然检查字节限制由于被定义的列的方式。

检查出你的表的定义,最有可能将列定义默认字符语义 - 这是一个字节(但取决于你安装的Oracle),因此它默认为VARCHAR2(255 Byte)

如果您重新定义列VARCHAR2(255 Char)事情应该没问题。

喜欢的东西:

CREATE TABLE FSR_SYSTEM_LOG 
(
    ... 
    MESSAGE VARCHAR2(255 Char), 
    ... 
); 

对我来说,似乎很奇怪存储XML这样的(长)有限公司列。你可以确保你的XML是从来没有超过255个字符长?你为什么不把信息存储为CLOB