【发布时间】:2020-02-08 00:55:36
【问题描述】:
我的数据库中有一个json 列,其中包含法语字符。所以当我使用时:
App\Job::where('name->fr', 'like', '%Fune%')->count();
对于名称中带有重音符号(例如 Funéraire)的职位,系统不会找到结果。我可以通过使用whereRaw 在查询中添加排序规则来完成我想要的:
App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE \'%Fune%\' collate utf8mb4_general_ci')->count();
但是,当我在 whereRaw 方法中使用绑定时:
App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE ? collate utf8mb4_general_ci', ['%Fune%'])->count();
我收到一个数据库错误:
COLLATION 'utf8mb4_general_ci' 对 CHARACTER SET 'binary' 无效(SQL: select count(*) from
jobswhere json_unquote(json_extract(name, '$."fr"')) LIKE %Fune%整理 utf8mb4_general_ci)
只是想知道为什么当我通过绑定传递它时它不起作用。
【问题讨论】:
-
这个错误其实更正确。 MySQL 中 JSON 列的排序规则始终是二进制 unicode 排序规则。
-
@apokryfos 但是,如果我使用原始查询,为什么它会起作用?
-
我推测:原始字符串将匹配连接的编码,而不是列。准备好的字符串将匹配列的编码。
utf8mb4_general_ci排序规则可能不适用于列编码,但适用于连接编码 -
这对我有用:
whereRaw('json_unquote(json_extract(name, \'$."fr"\')) LIKE convert(? using utf8mb4)', ['%Fune%']) -
@Adam 我有默认排序规则,但这不适用于 json 列。
标签: laravel eloquent laravel-6