在java中向sql列中插入8000多个字符(带换行符)
如何使用java将数据插入MS-SQL中超过8000个字符且换行的一列 我有一个来自在java中向sql列中插入8000多个字符(带换行符),java,sql,sql-server,Java,Sql,Sql Server,如何使用java将数据插入MS-SQL中超过8000个字符且换行的一列 我有一个来自psinfo的软件列表-使用StringBuilder将arraylist排序并转换为字符串,并将\n替换为“'+CHAR(13)+CHAR(10)+” 我可以在没有CHAR 10和CHAR 13的情况下插入大约15000个字符的所有文本,但我不能用新行插入,它只能插入大约8000个字符 你知道问题出在哪里吗 我的现场软件为VARCHAR(MAX) 我有以下声明: stmt.executeUpdate(…”,so
psinfo
的软件列表-使用StringBuilder将arraylist排序并转换为字符串,并将\n
替换为“'+CHAR(13)+CHAR(10)+”
我可以在没有CHAR 10
和CHAR 13
的情况下插入大约15000个字符的所有文本,但我不能用新行插入,它只能插入大约8000个字符
你知道问题出在哪里吗
我的现场软件为VARCHAR(MAX)
我有以下声明:
stmt.executeUpdate(…”,software=CAST(“+software+”,作为varchar(MAX));
我建议使用PreparedStatement
:
PreparedStatement stmt = con.prepareStatement("... software=? ...");
stmt.setString(index, veryLongStringWithNewlines);
stmt.executeUpdate();
这将避免字符串中与SQL方言的字符串文本语法冲突的字符出现任何问题
(我想不出,
CAST…AS
能实现什么,所以我把它漏掉了。我猜这是为了处理字符串长度或嵌入的换行符之类的问题。)我还建议不要创建这样的SQL表达式,而是直接将换行符添加到Java代码中的字符串中,并在参数化查询中使用结果。解决此问题并避免其他问题
但我对这个案例的“原因”很感兴趣,并做了一些测试
问题似乎是由+
字符串运算符导致的隐式强制转换引起的。返回操作数中具有这些类型中最高优先级的类型的状态
如果只包含varchar(n)
操作数,则该操作显然返回varchar(m)
,但不返回varchar(max)
。form
的值为8000
。因此,如果结果实际超过8000个字符,则数据将被截断
+
需要“查看”操作数中至少一个varchar(max)
,才能返回varchar(max)
如预期,结果为'b'
因此,由于来自Java程序的字符串中的行的长度可能从未超过8000个字符,因此
+
操作给出了varchar(8000)
,而整个字符串在没有任何操作的情况下超过了8000个字符的边界,并且隐式地被视为varchar(max)
由SQL Server提供。这就是程序突然中断的原因。为什么不离开它\n?:)它应该可以工作,这看起来像是一个非参数化查询-您能确认吗?您应该使用PreparedStatement。不要传递嵌入SQL字符串中的文本以及从系统内部输出的psinfo,所以数字、字母、任何-VARCHAR。。。是否可以像“preparedStatement.setString(X,我的15000个字符的softwarestring,字符10和字符13作为换行符”);“?我将重写所有的as preparedstatement。它看起来比我在代码上看到的更好。感谢您的提前。
SELECT '<put 8000 a's here>' + 'b'
SELECT '<put 8000 a's here>c' + 'b'
SELECT '<put 8000 a's here>' + convert(varchar(max), 'b')