laravel查询上的MySQL排序规则错误,与搜索参数有关

时间:2019-05-08 22:02:57

标签: mysql laravel collation

我的搜索查询中有COLLATE utf8mb4_bin,这是区分欧洲字符和非欧洲字符所必需的,例如aä

如果我使用硬编码搜索词运行查询,则该查询可以在phpmyadmin中使用,并且可以在以下小提琴上使用:db-fiddle。您可以看到该表具有CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci

但是在另一个小提琴网站(sqlfiddle)上,相同的查询给出了错误:

COLLATION 'utf8mb4_bin' is not valid for CHARACTER SET 'utf8'

laravel 中,如果我使用硬编码搜索词运行查询,则该查询可以正常运行,但如果使用参数,则会出现此错误:

SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_bin' is not 
valid for CHARACTER SET 'binary' 

所以这很奇怪。这是带有绑定参数的laravel查询,它会产生上述错误:

$query_events = "SELECT e.id, e.title, e.location,e.event_at, e.content as content, 
e.limited_participants,e.max_participants,associations.name, 
     CONCAT(:url,'/events/', e.id) AS permalink, 
            (SELECT COUNT(*) FROM event_participants evp WHERE evp.event_id = e.id) 
             AS participants
        FROM events AS e
        LEFT JOIN associations ON e.association_id = associations.id  
        WHERE CONCAT(e.title ,e.location ,e.content ,associations.name ) 
               LIKE :search
           COLLATE utf8mb4_bin
           ORDER BY e.event_at 
           DESC
           LIMIT 5";

        $results['events'] = DB::select($query_events,[ 
            'url'       =>   $url,
            'search'    =>   '%' . $search . '%'
        ]);

如果我删除COLLATE utf8mb4_bin,没有错误,但是欧洲/非欧洲字母混杂在搜索结果中。如果我对一些搜索参数进行了硬编码(例如在小提琴中),并注释掉了数组中的“搜索”属性,则查询将按预期工作,并给出正确的结果。

我使用xampp,根据phpmyadmin,mysql版本为5.7.22。

所以我需要使用该排序规则,并且需要能够使用搜索参数,但是如何避免此错误?

1 个答案:

答案 0 :(得分:0)

方案A:在查询前添加

SET NAMES utf8mb4;

方案B:更改文字的CHARACTER SET

LIKE _utf8mb4"%oteborg%"