Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于字段大小有限,数据未保存在数据库中_Java_Sql_Oracle - Fatal编程技术网

Java 由于字段大小有限,数据未保存在数据库中

Java 由于字段大小有限,数据未保存在数据库中,java,sql,oracle,Java,Sql,Oracle,数据库表fsr\u system\u log中有一列message用于模式fsr\u appl。此表应存储系统日志消息。列的大小为255,数据类型为varchar2。用于保存大小大于255个字符的邮件的逻辑为: public void saveSystemLog(SystemLogRequest systemLog){ User user = systemLog.getUser(); String system = systemLog.getSystem(); Log l

数据库表
fsr\u system\u log
中有一列
message
用于模式
fsr\u 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);
}
public void saveSystemLog(SystemLogRequest systemLog){
User=systemLog.getUser();
字符串system=systemLog.getSystem();
Log Log=systemLog.getSystemLog();
试一试{
初始化Legate();
delegate.beginTransaction();
LogEntry[]logEntries=log.getItemArray();
用于(日志条目:日志条目){
//保存每个条目
ParamVector params=新的ParamVector();
//检查消息是否大于255个字符
String message=logEntry.getMsg();
调试(“日志消息为:”+消息);
if(message.length()>255){
message=message.substring(0255);
notifier().debug(“大于255个字符的消息字符串:“+消息”);
}
参数add(消息,255,false);
}
但尽管实现了代码,我仍面临以下错误:

由于SQL错误,无法保存系统日志:ORA-12899:列“FSR\u APPL”“FSR\u system\u 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>

a62267
客户
2011-10-27T17:03:08.404+02:00
信息
Din注册器发送indmeldingen的数据]]>
2011-10-27T17:03:13.701+02:00
信息
Din注册器发送indmeldingen的数据]]>
2011-10-28812:45:47.801+02:00
信息
Din注册器发送indmeldingen的数据]]>
2011-10-28812:45:57.926+02:00
信息
gemme Fejl酒店
请帮忙


注意:抛出的错误仅适用于某些系统日志消息。抛出此错误时,实际值始终为常数257。

乍一看,我怀疑存在编码问题

Java使用unicode:unicode中的字符可能需要一到多个字节。。。 一个java字符串的长度可能是1,但在存储上封送时,它可能需要2个字节、4个字节

要检查字节长度,可能您应该尝试:

if(message.getBytes("US-ASCII").length()>255){ 
您的Oracle数据库的编码是什么


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

显然,您有一些字符用多个字节表示

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

查看表的定义,最有可能的是该列是使用默认字符语义定义的,即字节(但取决于您的Oracle安装),因此它默认为
VARCHAR2(255字节)

如果将列重新定义为
VARCHAR2(255个字符)
,则一切都会好起来

比如:

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

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

您可以将字段类型更改为CLOB、BLOB或XMLType。查找Oracle数据类型时,VARCHAR2似乎也可以处理字节

可以理解,您可能不想更改字段类型,在这种情况下,替换

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


您使用的是Java吗?看起来是,但可能是另一种语言。这可能是Java的问题。可能有一些非ASCII字符在UTF-8中表示为多字节字符。如果是这样,对255个字符执行子字符串将超过255个字节。在子字符串结果中调用getBytes,并获取字节数组的大小。@MarlinPierce Yes..我正在使用JAVA。如果使用子字符串没有帮助,那么我们还有什么选择?为什么我应该使用while循环?不只是使用“If”条件工作正常?好吧,现在您正好有一个多字节字符,大小一致为257。但是如果以后有两个多字节字符呢?另外,除非多字节字符是最后一个字符,否则您可能必须删除两个单字节字符,以从长度257变为255。
pos = 255
while (message.getBytes().size() > 255) {
  message = message.substring(0,pos--);
}