我的搜索查询中有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。
所以我需要使用该排序规则,并且需要能够使用搜索参数,但是如何避免此错误?
答案 0 :(得分:0)
方案A:在查询前添加
SET NAMES utf8mb4;
方案B:更改文字的CHARACTER SET
:
LIKE _utf8mb4"%oteborg%"