Postgres查询ILIKE和“%#{}%”

时间:2015-08-13 06:44:01

标签: sql ruby-on-rails ruby postgresql

我可以向我解释一下“?”防止sql注入?

select substring(item,1,charindex('/PE',item)-1) from table

为什么使用“%{term}%”而不是#{term}?百分比代表什么?

3 个答案:

答案 0 :(得分:2)

百分比是外卡字符,与值

的任何部分中的字符串匹配

答案 1 :(得分:1)

你实际上在那里问了两个不同的问题。

它们都没有与Rails特别相关,所以我将一般地回答它们(也因为我不熟悉Ruby!)。

如何使用'?'防止SQL注入

当您使用程序外部提供的值(用户提供的值)直接在SQL语句中进行SQL注入时。例如,假设您有这个伪代码:

sql="SELECT foo FROM bar WHERE name='"+name+"'"

其中name可能是包含用户输入数据的变量。但是,如果name包含单引号('),则SQL引擎会认为单引号是值的结尾,并继续将其余部分解析为SQL文本。

使用占位符(例如'?')可以避免这种情况,因为占位符内的值不需要引用 - 占位符的所有内容都被视为值的一部分,没有它将被解析为SQL,无论是否有任何嵌入式引号。

顺便提一下,所使用的占位符的实际形式在某种程度上取决于所使用的实际数据库引擎和/或客户端框架。本地地,Postgresql uses the $1, $2, etc for placeholders。许多框架将此扩展为允许“'”'和其他占位符语法。

为什么"%#{term}%"使用而不是#{term}

SQL ILIKE operator使用'%'标志作为通配符。表达式如:

taste ILIKE '%apple%'

匹配' apple',' rottenApple',' applesauce'或包含' apple'的任何其他字符串使用不区分大小写的匹配。

请注意'%'标志是ILIKE右手操作数的一部分,在引号内,所以你不能使用这样的占位符:

Candy.where("taste ILIKE %?%", "#{term}")

另一种选择是:

Candy.where("taste ILIKE '%' || ? || '%'", "#{term}")

这是有效的,因为||是连接运算符,因此它将字面值%与占位符的值连接,然后连接尾随的字面值%

答案 2 :(得分:0)

当您使用 LocalDateTime hournow = LocalDateTime.now(); LocalDateTime startOfYear = LocalDateTime.of(hournow.getYear(), 1, 1, 0, 0); long hoursBetween = ChronoUnit.HOURS.between(startOfYear, hournow); System.out.println("hours between: " + hoursBetween); 时,Rails将自行转义?个控制字符。