3

我想使用 Java 在 Sql 中存储一个包含 '\n' 的字符串。但问题出在数据库中,而不是 \na 新行正在被存储。

例如,字符串是“abcd\nefgh”,那么它被存储为的数据库

abcd
efgh

当我使用 php 存储这些东西时,我遇到了同样的问题,我克服了使用 mysqli_escape_real_string()

我怎样才能在java中克服这个问题?请帮忙。

4

3 回答 3

10

但问题出在数据库中,而不是 \na 新行正在被存储。

好吧,听起来字符串本身可能包含换行符。如果你写:

String x = "a\nb";

在 Java 中,这是一个包含 3 个字符的字符串:

  • '一种'
  • 新队
  • 'b'

应该在数据库中存储为 3 个字符的字符串。当你取回它时,你会忠实地得到一个由 3 个字符组成的字符串。数据库将简单地存储你给它的东西。

现在,如果您说您正在尝试存储一个实际上包含反斜杠后跟一个 的字符串,并且该字符串n正在某处转换为换行符,那么您需要发布一些代码来显示您在做什么. 例如,我可以想象如果您将值直接包含在 SQL 语句中,而不是使用参数化 SQL ,可能会发生这种情况。始终使用参数化 SQL。)

所以基本上,要么它实际上根本不是问题,要么你应该发布一些代码。

编辑:现在我们已经看到了:

当我使用 php 存储这些东西时,我遇到了同样的问题,我克服了使用 mysqli_escape_real_string()

听起来您可能只是面临在 SQL 语句中不恰当地包含值的问题。如果您正在使用类似的东西:

String sql = "INSERT INTO TABLE FOO VALUES ('" + text + "')";
Statement statement = connection.createStatement();
statement.executeUpdate(sql);

那么你需要停止这样做。你应该使用:

String sql = "INSERT INTO TABLE FOO VALUES (?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, text);
statement.execute();

(使用适当的代码来关闭语句和连接,例如 Java 7 中的 try-with-resources 语句。)

于 2013-11-07T06:57:11.520 回答
5

\n 是换行符。如果你想将这样的组合存储为文本,你必须转义\,所以我想你必须为目标字符串中\\n的每一次出现存储。\n但是,转义字符可能对 DBMS 很不利。

于 2013-11-07T06:57:19.080 回答
1

如果您不使用参数化查询而是进行原始插入(我不建议这样做),也许您必须双重转义反斜杠,因为它也是 mysql 中的关键字。

String query = "INSERT INTO TABLE VALUES ('Hello\\\\nWorld')";
于 2013-11-07T07:00:52.040 回答