在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 10CHAR 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 的 m8000。因此,如果结果实际上超过 8000 个字符,则数据将被截断。

+ 需要在操作数中“看到”至少一个varchar(max) 才能返回varchar(max)

SELECT '<put 8000 a's here>' + 'b'

导致'&lt;put 8000 a's here&gt;'(没有'b'),而

SELECT '<put 8000 a's here>c' + 'b'

结果为@​​987654336@。

要获得varchar(max) 的结果,给+ 一个这样的操作数就足够了,可能是convert()

SELECT '<put 8000 a's here>' + convert(varchar(max), 'b')

结果如预期的那样'&lt;put 8000 a's here&gt;b'

因此,由于 Java 程序中字符串中的行长度可能永远不会超过 8000 个字符,+ 操作给出了varchar(8000),而整个字符串,没有任何操作超过了 8000 个字符的边界并且是SQL Server 将其隐式视为varchar(max)。这就是为什么程序突然中断的原因。

【讨论】:

以上是关于在java中插入超过8000个字符并带有换行符的sql列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ExecuteNonQuery 在 VARCHAR(MAX) 列中插入超过 8000 个字符?

正则表达式:检查是不是有超过 x 个换行符

SQL server字符串字段怎么存储换行符?

如何在 element.textContent 中插入换行符/回车符?

截断段落前 100 个字符并隐藏段落的其余内容以显示/隐藏带有更多/更少链接的其余内容

在 Java 中使用 hasNext 创建可变长度的自动换行