是否有一个mySQL等同于Postgresql的“Dollar-Quoted String Constants”?

时间:2009-04-25 01:20:45

标签: mysql

在postgresql中,可以使用“Dollar-Quoted String Constants”来避免在常量字符串中转义单引号:

没有Dollar-Quoted字符串常量:

'Jeff''s table'

使用Dollar-Quoted字符串常量:

$$Jeff's table$$

是否有MySQL等价物?

编辑:我不是在寻找一种清理输入的方法,我正在寻找一种方法来生成更容易阅读的查询。

2 个答案:

答案 0 :(得分:1)

不,因为它不起作用。攻击者只是在他们的注射尝试中添加了一对美元符号。

处理此问题的正确方法是使用实​​际查询参数的系统,以便参数值永远不会直接替换为查询字符串。这通常对性能更好,因为db可以更好地缓存执行计划,而不是最终动态构建字符串,这在现代语言中往往很慢。

没有多余的连接语句也大大提高了代码的可读性。而不是:

sql = "SELECT * FROM MyTable WHERE Column1=$$" + somevarialbe + "$$ AND Column2=$$" + OtherVariable";

就是这样:

sql = "SELECT * FROM MyTable wHERE Column1=@Value1 AND Column2=@Value2";

嗯......好的,我现在可以看到这个功能的一些有限效用。

想象一下具有存储过程的票证跟踪系统,以获取打开的票证。实际上,您可能会将文本“open”硬编码到查询的where子句中。并不是说这是一个很好的设计 - 故障单状态应该在一个带有它自己的密钥的表中,这样你就可以对密钥进行硬编码而不是文本。但它为有效和更复杂的东西种下种子。

答案 1 :(得分:1)

您可以将字符串括在双引号中,例如

"Jeff's table"

注意:如果这不起作用,则表示您已启用ANSI_QUOTES SQL模式。 MySQL docs说:

  

如果启用了ANSI_QUOTES SQL模式,则只能在单引号内引用字符串文字,因为双引号内引用的字符串被解释为标识符。