MySQL 旧版使用LIKE模糊搜索json数据

工作中有时候会用到json来保存数据,而MySQL5.7之前是不支持json类型字段的。因为json_encode后的中文是unicode编码类型的,直接用中文去搜索是没办法匹配的。所以我们需要把搜索的字段转为unicode编码,再去模糊搜索就可以了。

代码如下:

//把需要匹配的字段用json_encode转义,并去掉转义后的字符串带的双引号
$params = str_replace('"','',json_encode($params));  
//把转义后的unicode编码数据中的“\”替换成“_”
$params = str_replace("\\",'_',$params);  

 TP框架自定义查询:

/**
 * 自定义查询表
 * @param $params
 * @return array
 */
 public function getList($params)
    {
        $page = !empty($params['page']) ? $params['page'] : 1;
        $limit = !empty($params['limit']) ? $params['limit'] : 10;
        $where = [];
        $backData = [
            'total' => 0,
            'list' => [],
        ];
        if ($params['status'] >= 0) {
            $where['status'] = $params['status'];
        }
        $tableName = $params['table'];
        $createTime = !empty($params['create_time']) ? $params['create_time'] : 0;
        $updateTime = !empty($params['update_time']) ? strtotime(date('Y-m-d 23:59:59', $params['update_time'])) : time();
        $where['create_time'] = [['>=', $createTime], ['<=', $updateTime]];

        if (!empty($params['push_data'])) {
            //因数据库版本原因,只能采取该方式查询json数据
            if (is_numeric($params['data'])) {
                $data = $params['data'];
            } else {
                //去除json_encode转义的后字符串带的双引号
                $data = str_replace('"', '', json_encode($params['data']));
                //把转义后的unicode编码数据中的“\”替换成“_”
                $data = str_replace("\\", '_', $data);
            }
            $where['data'] = ['LIKE', "%$data%"];
        }

        $total = $this->name("$tableName")->where($where)->count();
        if ($total > 0) {
            $backData['total'] = $total;
            $list = $this->name("$tableName")->field('*')
                ->where($where)->page($page, $limit)->order('id DESC')->select();
            if ($list) {
                $backData['list'] = $list;
            }
        }
        return $backData;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值