在java中插入超过8000个字符并带有换行符的sql列
Posted
技术标签:
【中文标题】在java中插入超过8000个字符并带有换行符的sql列【英文标题】:Insert into sql column more than 8000 chars with line breaks in java 【发布时间】:2018-05-09 12:19:32 【问题描述】:如何使用java将数据插入MS-SQL的一列超过8000个字符并带有换行符?
我有一个来自 psinfo
的软件列表 - 使用 StringBuilder 对 arraylist 进行排序并将其转换为字符串,并将 \n
替换为 "' + CHAR(13)+CHAR(10) + '"
我可以在没有CHAR 10
和CHAR 13
的情况下插入大约 15000 个字符的所有文本,但我不能用新行插入它,它只能插入大约 8000 个字符。
你知道问题出在哪里吗?
我有现场软件作为 VARCHAR(MAX)
我有这样的声明:
stmt.executeUpdate(... "',software= CAST('" + software + "' AS varchar(MAX))...);
【问题讨论】:
为什么不离开它\n? :) 它应该可以工作 这看起来像是一个非参数化查询 - 你能确认一下吗? 您应该使用 PreparedStatement。不要传递嵌入在 SQL 字符串中的文字 它从 sysinternals 输出 psinfo,所以数字,字母,任何东西 - VARCHAR... 是否可以像“preparedStatement.setString(X,”my 15 000 chars softwarestring with CHAR10 and CHAR 13 作为换行符");" ? 【参考方案1】:我建议使用PreparedStatement
:
PreparedStatement stmt = con.prepareStatement("... software=? ...");
stmt.setString(index, veryLongStringWithNewlines);
stmt.executeUpdate();
这将避免字符串中的字符与 SQL 方言的字符串文字语法冲突的任何问题。
(我不知道CAST ... AS
会实现什么,所以我把它省略了。我猜这是试图处理字符串长度或嵌入的换行符之类的东西。)
【讨论】:
我将全部重写为preparedstatement。当我查看代码时,它看起来更好。感谢您的提前。【参考方案2】:我还建议不要创建这样的 SQL 表达式,而是将换行符直接添加到 Java 代码中的字符串并在参数化查询中使用结果。解决这个问题,避免其他问题。
但我对这个案例的“原因”很感兴趣,并做了一些测试。
问题似乎是由 +
字符串运算符导致的隐式转换引起的。 docs 状态,即返回操作数中这些类型中具有最高优先级的类型。
如果只包含varchar(n)
操作数,则该操作显然会返回varchar(m)
,但不会返回varchar(max)
。 maximum 的 m
是 8000
。因此,如果结果实际上超过 8000 个字符,则数据将被截断。
+
需要在操作数中“看到”至少一个varchar(max)
才能返回varchar(max)
。
SELECT '<put 8000 a's here>' + 'b'
导致'<put 8000 a's here>'
(没有'b'
),而
SELECT '<put 8000 a's here>c' + 'b'
结果为@987654336@。
要获得varchar(max)
的结果,给+
一个这样的操作数就足够了,可能是convert()
。
SELECT '<put 8000 a's here>' + convert(varchar(max), 'b')
结果如预期的那样'<put 8000 a's here>b'
。
因此,由于 Java 程序中字符串中的行长度可能永远不会超过 8000 个字符,+
操作给出了varchar(8000)
,而整个字符串,没有任何操作超过了 8000 个字符的边界并且是SQL Server 将其隐式视为varchar(max)
。这就是为什么程序突然中断的原因。
【讨论】:
以上是关于在java中插入超过8000个字符并带有换行符的sql列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ExecuteNonQuery 在 VARCHAR(MAX) 列中插入超过 8000 个字符?
如何在 element.textContent 中插入换行符/回车符?