mysql - COLLATION 'utf8mb4_general_ci' 对于字符集 'binary' 无效

标签 mysql laravel-5 collation

我想通过搜索“Yilmaz”在我的 Laravel 应用程序中查找名为“Yılmaz”的用户

默认情况下,在 Laravel 中(使用 utf8mb4_unicode_ci 作为我的连接的排序规则)

\App\User::whereRaw('name LIKE ?', '%Yilmaz%')->get();

不返回任何内容。

正如我在 MySQL does not treat ı as i? 中发现的那样,它适用于排序规则 utf8mb4_general_ci。但是,不建议使用 utf8mb4_general_ci 作为默认排序规则,因为它不准确 sorting .

我的第一次尝试是

\App\User::whereRaw('name LIKE ? collate utf8mb4_general_ci', '%Yilmaz%')->get();

但这会抛出

SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_general_ci' is not valid for CHARACTER SET 'binary' (SQL: select * from users where name LIKE %Yilmaz% collate utf8mb4_general_ci)

接下来,我尝试了https://stackoverflow.com/a/58493518/2311074

\App\User::whereRaw('name LIKE convert(? using utf8mb4)', '%Yilmaz%')->get();

但这会返回

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation 'like' (SQL: select * from users where name LIKE convert(%Yilmaz% using utf8mb4))

如何在 Laravel 中将一个查询的排序规则更改为 utf8mb4_general_ci

最佳答案

两者的结合对我来说很有效:

\App\User::whereRaw(
    'name LIKE convert(? using utf8mb4) collate utf8mb4_general_ci',
    '%Yilmaz%'
)->get();

但我不确定这是否是最好的方法。

关于mysql - COLLATION 'utf8mb4_general_ci' 对于字符集 'binary' 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214706/

相关文章:

mysql - 获取mysql表的总和并加入另一个表以获取名称

java - 如何使用 Hibernate 在 MySQL 数据库中创建特定表

mysql - 如何从此字符串/laravel 获取时间戳

php - 何时在 Laravel 中生成新的应用程序 key ?

PHP 将新属性附加到对象时出现问题?

mysql - 如何在不删除数据库的情况下删除 phpMyAdmin 中数据库中所有表的内容?

java - axios请求: Blocked by CORS Policy

php - Laravel 中通过 slug 而不是 ID 进行复杂查询并获取结果

mysql - 存储过程中的数据库排序规则

c++ - 何时使用 Boost.Locale 进行大小写折叠以及何时整理?