作为字段值的转义引用会使我的sql脚本崩溃

时间:2012-03-01 18:14:06

标签: mysql sql escaping

我有以下dml sql(由mysql wb生成):

INSERT INTO `status_need` VALUES (1,1,1,'famille cherchant une autre famille (pour garde partagée ou sortie d\'école)'),(2,1,2,'famille cherchant professionnelle de la garde d\'enfants'),(3,2,1,'professionnelle de la garde d\'enfants cherchant enfants à garder');

当我从java运行它时,它可能会因为字段值中的撇号/引号而引发错误。

我不确定为什么这是因为引号被反斜杠转义,而且这个SQL是由mysql本身生成的。

有谁能告诉我如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

引用mysql文档:

There are several ways to include quote characters within a string:

A “'” inside a string quoted with “'” may be written as “''”.

A “"” inside a string quoted with “"” may be written as “""”.

Precede the quote character by an escape character (“\”).

A “'” inside a string quoted with “"” needs no special treatment and need not be doubled or escaped. In the same way, “"” inside a string quoted with “'” needs no special treatment.

但是正确的答案是你应该寻找java为你做这个的方式。有些想法就像real_escape php一样。请参阅:http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html

答案 1 :(得分:1)

我猜你的Java代码有一个字符串文字,如下所示:

"INSERT INTO `status_need` VALU...ie d\'écol..."

不起作用的原因是在Java中,在字符串文字中,\'表示'。您需要通过编写\来转义反斜杠\\

"INSERT INTO `status_need` VALU...ie d\\'écol..."

(或者,正如danihp所说,你可以通过编写''而不是\'来回避这个问题:MySQL支持在单引号字符串中转义单引号的两种方式。)

答案 2 :(得分:1)

推荐的方法主要是使用预备语句。您可以参考以下链接 http://lists.mysql.com/java/5469

同时手动替换所有实例可能会产生奇怪的结果。为此,请参阅下面的博客说明。

http://www.bartbusschots.ie/blog/?p=141