在 Yii 2.0 中,使用 like 操作符查找 / ,结果为空的分析,原因在于 MySQL 版本的官方 Bug

1、请求参数:filter[and][0][or][0][title][like]=/,生成 SQL 如下,查找结果为空。如图1

请求参数:filter[and][0][or][0][title][like]=/,生成 SQL 如下,查找结果为空

图1

`pa_plan`.`title` LIKE '%////%'

2、查看表 plan 中的字段 title 的值,其中一条记录存在 /。理论上能够查询出一条记录才是。如图2

查看表 plan 中的字段 title 的值,其中一条记录存在 /。理论上能够查询出一条记录才是

图2

3、在 MySQL 客户端软件 Navicat for MySQl 中执行 SQL,4 根反斜杠,查找结果为空。如图3

在 MySQL 客户端软件 Navicat for MySQl 中执行 SQL,4 根反斜杠,查找结果为空

图3

SELECT * FROM `pa_plan` WHERE `title` LIKE '%////%'

4、查看表 plan 中的字段 title 的排序规则,其值为:utf8mb4_unicode_ci。如图4

查看表 plan 中的字段 title 的排序规则,其值为:utf8mb4_unicode_ci

图4

5、执行 SQL,5 根反斜杠(添加 1 根),查询出一条记录。如图5

执行 SQL,5 根反斜杠(添加 1 根),查询出一条记录

图5

SELECT * FROM `pa_plan` WHERE `title` LIKE '%/////%'

6、修改表 plan 中的字段 title 的排序规则,其值为:utf8mb4_general_ci。如图6

修改表 plan 中的字段 title 的排序规则,其值为:utf8mb4_general_ci

图6

7、执行 SQL,4 根反斜杠,查询出一条记录。如图7

执行 SQL,4 根反斜杠,查询出一条记录

图7

SELECT * FROM `pa_plan` WHERE `title` LIKE '%////%'

8、查看 MySQL 官方文档,参考:https://bugs.mysql.com/bug.php?id=81990 。在 MySQL 版本:5.6.31/5.7.13 中,排序规则,其值为:utf8mb4_unicode_ci 时,皆需要针对 / 的搜索,再添加 1 根,才能够搜索出结果。此 Bug 在 MySQL 版本:8.0.18 得以修复。如图8

查看 MySQL 官方文档,参考:https://bugs.mysql.com/bug.php?id=81990 。在 MySQL 版本:5.6.31/5.7.13 中,排序规则,其值为:utf8mb4_unicode_ci 时,皆需要针对 / 的搜索,再添加 1 根,才能够搜索出结果。此 Bug 在 MySQL 版本:8.0.18 得以修复

图8

9、查询当前数据库版本:5.7.19。如图9

查询当前数据库版本:5.7.19

图9

10、后续确认一下能否在 Yii 2.0 中针对 like / 的搜索生成 SQL,自动再添加 1 根 / 。此问题,先暂缓处理。因为像其他的特殊字符的搜索是正常的。

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/webdev/181657.html

(0)
上一篇 2021年11月1日 06:56
下一篇 2021年11月1日 06:56

相关推荐

发表回复

登录后才能评论