MySQL 中使用 LIKE 语句时如何安全过滤后参数?

直接拼接用户输入是危险的! 2 01 9 年,某网站因未能过滤用户输入而遭遇SQL注入,导致1 000条数据丢失。
安全做法:使用准备好的语句。
PHP PDO 示例: $stmt=$pdo->prepare("从名称类似:关键字的项目中选择"); $keyword="%".$userInput."%"; $stmt->bindParam(':keyword', $keyword); $stmt->execute(); 如果不是,请转义特殊字符并添加反斜杠。
SQL 示例: SELECT FROM items WHERE name LIKE '%project\_好%' ESCAPE ''; 转义字符必须与 ESCAPE 子句一致。
当业务允许时删除通配符。
Java 示例: String sql="SELECT FROM items WHERE name LIKE ?"; 准备语句 stmt=connection.prepareStatement(sql); stmt.setString(1 , "%" + userInput + "%"); 不要直接使用用户输入,风险很高!

MySQL 查询优化:如何在商品搜索中高效使用 Like 和 In?

上周我读了 MySQL 搜索优化文档。

全文索引是一件好事。
我使用的是2 02 3 年的MySQL8 .0版本。
创建全文索引很简单:ALTERTABLEgoodsADDFULLTEXTINDEXft_title(title);。
搜索时使用 MATCHAGAINST 效率更高:SELECTtitleFROMgoodsWHEREMATCH(title)AGAINST('Blue Moon Laundry Detergent'INBOOLEANMODE);。
这种方法比多次LIKE更容易使用。

小心前缀匹配。
2 02 2 年,我有 SELECTtitleFROMgoodsWHEREtitleLIKE'Blue Moon%';尝试过。
模式必须在一开始就确立。
像 %Blue Moon 这样的东西是行不通的。

IN查询必须控制数量。
2 02 3 年我有 Category_idIN(1 ,3 ,5 );已测试。
太多的值会使速度变慢。
我的这个朋友掉进了陷阱。

临时表是一个解决方案。
2 02 3 年,我执行了以下操作:CREATETEMPORARYTABLEtemp_ids(idINT);。
然后加入查询。
比直接输入更好。

全文索引最好。
2 02 3 年对比测试表明效率明显更高。
比LIKE快十倍以上。

监控很重要。
我用EXPLAIN查看了2 02 3 年的执行计划,检查是否使用了索引。

IT是一个很好的解决方案。
我是2 02 3 年发现ES的,多字段搜索非常方便:{"query":{"multi_match":{"query":"蓝月亮洗衣液","fields":["title","description"]}}}。

算了。
由你决定。