Мой поисковый запрос содержит 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
, ошибки не возникает, но европейские / неевропейские буквы смешиваются в результатах поиска. Если я жестко закодирую какой-либо параметр поиска (как в скриптах) и закомментирую свойство «search» в массиве, запрос будет работать так, как должен, и даст правильные результаты.
Я использую xampp и версия mysql 5.7.22 в соответствии с phpmyadmin.
Так что мне нужно использовать это сопоставление и уметь использовать параметр поиска, но как мне избежать этой ошибки ??