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--);
}