Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 如果具有回车符/换行符,则无法将字符串插入Oracle DB_Java_String_Oracle - Fatal编程技术网

Java 如果具有回车符/换行符,则无法将字符串插入Oracle DB

Java 如果具有回车符/换行符,则无法将字符串插入Oracle DB,java,string,oracle,Java,String,Oracle,我有一个Java程序,可以读取电子邮件正文,并将选定的数据插入我的Oracle 11g数据库 但是,我发现在尝试将数据字符串插入Oracle数据库时出现以下错误: ORA-01461:只能为插入到长列中绑定长值 数据库列的类型为VARCHAR2(4000),我不希望更改数据类型 我将字符限制设置为500,如果字符串长度超过500,我将使用substring方法将字符串长度减少到500。但是,我发现,当超过字符限制时,我使用substring方法将其减少到500个字符,如果字符串中存在新行和回车符

我有一个Java程序,可以读取电子邮件正文,并将选定的数据插入我的Oracle 11g数据库

但是,我发现在尝试将数据字符串插入Oracle数据库时出现以下错误:

ORA-01461:只能为插入到长列中绑定长值

数据库列的类型为VARCHAR2(4000),我不希望更改数据类型

我将字符限制设置为500,如果字符串长度超过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