Java 如果具有回车符/换行符,则无法将字符串插入Oracle DB
我有一个Java程序,可以读取电子邮件正文,并将选定的数据插入我的Oracle 11g数据库 但是,我发现在尝试将数据字符串插入Oracle数据库时出现以下错误: ORA-01461:只能为插入到长列中绑定长值 数据库列的类型为VARCHAR2(4000),我不希望更改数据类型 我将字符限制设置为500,如果字符串长度超过500,我将使用Java 如果具有回车符/换行符,则无法将字符串插入Oracle DB,java,string,oracle,Java,String,Oracle,我有一个Java程序,可以读取电子邮件正文,并将选定的数据插入我的Oracle 11g数据库 但是,我发现在尝试将数据字符串插入Oracle数据库时出现以下错误: ORA-01461:只能为插入到长列中绑定长值 数据库列的类型为VARCHAR2(4000),我不希望更改数据类型 我将字符限制设置为500,如果字符串长度超过500,我将使用substring方法将字符串长度减少到500。但是,我发现,当超过字符限制时,我使用substring方法将其减少到500个字符,如果字符串中存在新行和回车符
substring
方法将字符串长度减少到500。但是,我发现,当超过字符限制时,我使用substring方法将其减少到500个字符,如果字符串中存在新行和回车符,则会出现ORA-01461错误
我尝试删除新行和回车符,但奇怪的是,这并没有阻止此错误的发生,即使在调试时,我可以清楚地看到\r和\n字符已从字符串中删除:
if(myString.length() > 500)
{
myString= myString.substring(0, 500);
}
// Remove any carriage return and new lines
myString= myString.replaceAll("[\n\r]", "");
当我超过字符限制但字符串中没有EOL或回车字符时,它将被插入到数据库中,不会出现任何问题。
当我没有超过字符限制,但存在EOL或回车字符时,它也将被插入到数据库中,不会出现任何问题
因此,只有当包含EOL和回车的字符串超过500个字符时,才会出现问题,即使在插入数据库之前尝试替换这些字符也是如此
我正在使用参数化的PreparedStatement
插入数据,如下所示:
preparedStatement.setString(10, myString);
SQL是这样的,col10是我遇到问题的列(不是真正的列名):
VARCHAR(4000)意味着它可以存储4000字节的字符串,因此根据您的编码,它可以存储1000个或更多长度的字符串(UTF-8)
您可以使用检查字节长度
final byte[] utf8Bytes =string.getBytes("UTF-8") //depends on your encoding
System.out.println(utf8Bytes.length);
但是带有JDBC的Oracle在VARCHAR2(4000)中有一个已知的bug:
您可以尝试设置此属性,看看它是否可以解决问题
oracle.jdbc.RetainV9LongBindBehavior = true
如果您想了解有关此修复程序的更多信息:事实证明,INSERT语句还将电子邮件的整个正文插入到数据库的另一列(也是VARCHAR2(4000))中,而没有减小其大小。所以我得到的错误与SQL语句中的参数10无关 一定要很长时间吗?CLOB可以吗?甚至是一个VARCHAR?它不是一个长的,它是一个VARCHAR(4000)列。我不知道为什么错误会说它是一个长列,而事实并非如此。如果可能,我希望避免由于各种复杂情况而更改数据类型。请显示INSERT语句和所有相关java代码。首先执行replaceAll,然后执行子字符串,这样您将有更多文本。如果(myString.length()>500){myString=myString.replaceAll(“[\n\r]”,“”);}myString=myString.substring(0500);在进入系统时,字节大小是9570。例如,在对字符串进行操作后,字节大小将减少到300字节,这应该可以。我将尝试设置该属性,看看这是否解决了问题。感谢您的帮助。不幸的是,设置此属性失败。我的数据库是oracle11g
oracle.jdbc.RetainV9LongBindBehavior = true