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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章