0

message数据库表中有一个fsr_system_log用于 schema的列fsr_appl。该表应该存储系统日志消息。列的大小为 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);
}

但是尽管实现了代码,我仍然面临以下错误:

由于 SQL 错误,无法保存系统日志:ORA-12899:“FSR_APPL”列的值太大。“FSR_SYSTEM_LOG”。“MESSAGE”(实际:257,最大: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。

4

3 回答 3

1

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

在 Java 中,您以字符为单位获得字符串的长度,而 Oracle 显然会根据列的定义方式检查字节限制。

查看表的定义,很可能该列是使用默认字符语义定义的 - 它是字节(但取决于您的 Oracle 安装),所以它默认为VARCHAR2(255 Byte)

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

就像是:

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

对我来说,将 XML 存储在这样一个(长度)有限的列中似乎很奇怪。你能确保你的 XML永远不会超过 255 个字符吗?为什么不将消息存储为CLOB?

于 2012-10-23T13:05:46.113 回答
0

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

Java 使用 unicode:unicode 中的一个字符可能需要一个到多个字节... Java 字符串的长度可能是 1,但是当在存储上编组时,它可能需要 2 个字节,4 个字节...

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

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

您的 Oracle DB 的编码是什么?

另一个可能的问题是写入数据库的类将 CR/LF(0D0A) 添加到 msg 参数或其他内容......

于 2012-10-23T12:52:20.283 回答
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--);
}
于 2012-10-23T14:05:52.733 回答