COLLATION 'utf8mb4_general_ci' 对 CHARACTER SET 'binary' 无效

Posted

技术标签:

【中文标题】COLLATION \'utf8mb4_general_ci\' 对 CHARACTER SET \'binary\' 无效【英文标题】:COLLATION 'utf8mb4_general_ci' is not valid for CHARACTER SET 'binary'COLLATION 'utf8mb4_general_ci' 对 CHARACTER SET 'binary' 无效 【发布时间】:2020-03-31 12:56:48 【问题描述】:

我想通过搜索“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]: 语法错误或访问冲突:1253 COLLATION 'utf8mb4_general_ci' 对 CHARACTER SET 'binary' 无效(SQL: select * from users where name LIKE %Yilmaz% collat​​e utf8mb4_general_ci)

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

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

但这会返回

SQLSTATE[HY000]: 一般错误: 1267 非法混合排序规则 (utf8mb4_unicode_ci,IMPLICIT) 和 (utf8mb4_general_ci,IMPLICIT) 用于操作 'like' (SQL: select * from users where name LIKE convert(%Yilmaz% using utf8mb4))

如何在 Laravel 中将排序规则更改为 utf8mb4_general_ci 仅针对一个查询?

【问题讨论】:

name 列是否配置为在 MySQL 中使用二进制排序规则?如果您需要以这种方式搜索,这看起来像是一个忽略。 @ÁlvaroGonzález column name as collat​​ion utf8mb4_unicode_ci 【参考方案1】:

两者的结合对我有用:

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

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

【讨论】:

或者...'name LIKE _utf8mb4 ? collate utf8mb4_general_ci',

以上是关于COLLATION 'utf8mb4_general_ci' 对 CHARACTER SET 'binary' 无效的主要内容,如果未能解决你的问题,请参考以下文章

数据库sql导入错误 Unknown collation: 'utf8mb4_0900_ai_ci'

wordpress导入数据错误MySQL返回:#1273 – Unknown collation:’utf8mb4_unicode_ci’

MySQL执行SQL文件出现Unknown collation ‘utf8mb4_0900_ai_ci‘的解决方案

SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION 'utf8mb4_unicode_ci' is no

MySQL数据库导入SQL文件报错Unknown collation: ‘utf8mb4_0900_ai_ci‘

utf8mb4_general_ci报错解决方案