雄辩的 whereRaw 不适用于绑定
Posted
技术标签:
【中文标题】雄辩的 whereRaw 不适用于绑定【英文标题】:Eloquent whereRaw is not working with bindings 【发布时间】: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
jobs
where 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 列。
【参考方案1】:
下巴。
如果数据库中有一个 JSON 列,则可以直接在该列上触发类似查询,因为 JSON 是一个字符串,并且 like %text% 搜索字符串中的文本。
您不必费心寻找相似的名字。
您的查询可能有点像这样,
App\Job::where('name_of_column_of_json', 'like', '%Fune%')->count();
你会得到想要的输出。
点击它并告诉我们,它是否有效。
【讨论】:
我已经试过了。这是我的第一次尝试,但正如我在问题中提到的,它不适用于具有法语字符的结果,例如Funéraire
。只有当我改为查询 %Fun%
时它才会起作用。
必须尝试传递“Funé”作为输入,我想这会起作用。
这就是我的问题的重点......即使我搜索Fune
,我也希望它能够找到结果......我知道如果我用重音搜索它会起作用。【参考方案2】:
您需要将绑定转换为 UTF-8:
App\Job::whereRaw(
'json_unquote(json_extract(name, \'$."fr"\')) LIKE convert(? using utf8mb4)',
['%Fune%']
)
【讨论】:
不得不使用这个:convert(? using utf8mb4) collate utf8mb4_general_ci
以上是关于雄辩的 whereRaw 不适用于绑定的主要内容,如果未能解决你的问题,请参考以下文章