Mysql ошибка сопоставления в запросе laravel, связанная с параметром поиска - PullRequest
0 голосов
/ 09 мая 2019

Мой поисковый запрос содержит 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.

Так что мне нужно использовать это сопоставление и уметь использовать параметр поиска, но как мне избежать этой ошибки ??

1 Ответ

0 голосов
/ 09 мая 2019

План A: Предисловие к запросу

SET NAMES utf8mb4;

План B: изменить CHARACTER SET литерала:

LIKE _utf8mb4"%oteborg%"
...