Laravel中区分大小写的where语句

25

如何在 Laravel 中进行区分大小写的字符串匹配?


SELECT * FROM `invites` WHERE `token`='OGwie2e2985tOEGewgu23hUFs'

可以使用以下方式:

Invite::where('token', $token, 'LIKE BINARY')->first()


如果我想要进行区分大小写的匹配,我需要使用像这样的语句(或类似的语句):

SELECT * FROM `invites` WHERE BINARY `token`='OGwie2e2985tOEGewgu23hUFs'

我的最佳猜测是:

Invite::whereRaw("BINARY `token`='{$token}'")->first()

但这样输入就不会经过预处理语句,对吗?


如何将表更改为区分大小写的排序规则? - Marc B
3
为什么第一个示例查询不区分大小写? - Jon
@Jon 取决于使用的MySQL编码。有区分大小写的编码。 - ceejayoz
@ceejayoz...在这种情况下,要问的正确问题是Marc所说的——为什么该列首先具有不区分大小写的排序规则?现在提出的问题闻起来像是一个错误正在寻找另一个错误来弥补。 - Jon
@Jon 我同意。只是指出一下 - 我以前见过选择不正确的排序规则导致这种情况。 - ceejayoz
@MarcB — 抱歉,我没有意识到这么简单。我想它默认为 utf8_unicode_ci,但我猜 utf8_bin 也可以工作? - Andy Fleming
3个回答

43

您需要使用DB::raw(),或许类似于这样

Invite::where(DB::raw('BINARY `token`'), $token)->first();

这已经超出了问题的范围,但是这个答案让我想到了一个主意:DB::raw() 也可以与其他语句一起使用,比如 whereIn()Model::whereIn(DB::raw('BINARY \field_name`'), $values)->get();` - Johannes Trümpelmann
2
注意,这将不使用索引。 - Player1
我在使用这个查询时遇到了phpunit测试错误,但在laravel中运行正常。 - hemant
2
要使用在表上定义的索引,请改用Invite::whereRaw("`token`= BINARY ?",[$token])->first() - Kibo

16

虽然有点晚,但这难道不是更好的选择吗?

Invite::whereRaw("BINARY `token`= ?", array($token))->first()

1
只有在使用 PHP 版本低于 5.4 的情况下才能这样做。 - RevNoah
@RevNoah 这个评论没有意义。 - miken32

11

我知道这个问题很老了,但如果有人偶然发现它,这是最新版本的Laravel 8中有效的:

在你的迁移中:

$table->string("token")->charset("utf8")->collation("utf8_bin")->nullable();

如果您尚未处理现有模式,则可以实现区分大小写而无需修改每个查询。由于问题未提供结构是否已创建的上下文,因此如果您始终希望以区分大小写方式查询列,则可以应用此方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接