【问题标题】:Case-sensitive where statement in laravellaravel 中区分大小写的 where 语句
【发布时间】:2014-10-19 03:08:58
【问题描述】:

如何使用 laravel 进行区分大小写的字符串匹配?


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

可以这样做

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


如果我想要一个区分大小写的匹配,我需要使用这样的语句(或类似的,据我所知):

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

我的最佳猜测是:

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

但是我的输入不是通过准备好的语句,对吧?

【问题讨论】:

  • 让表格变成区分大小写的排序规则?
  • 为什么第一个示例查询区分大小写?
  • @Jon 取决于使用的 MySQL 编码。有区分大小写的。
  • @ceejayoz ...在这种情况下,要问的正确问题是 Marc 所说的 - 为什么该列首先具有不区分大小写的排序规则?就目前的问题而言,现在的问题是一个错误的人在寻找另一个人做出正确的决定。
  • @Jon 我同意。只是指出来 - 我以前见过错误选择的排序规则导致这种情况。

标签: php mysql laravel-4 eloquent case-sensitive


【解决方案1】:

您将需要使用 DB::raw(),可能类似于

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

或者:

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

【讨论】:

  • 这超出了问题的范围,但这个答案让我想到了这个想法:DB::raw() 也适用于其他语句,如whereIn()Model::whereIn(DB::raw('BINARY `field_name`'), $values)->get();
  • 注意,这不会使用索引。
  • 我在这个查询中遇到 phpunit 测试错误,但在 laravel 中运行良好
  • 要使用表上定义的索引,请改用Invite::whereRaw("`token`= BINARY ?",[$token])->first()
【解决方案2】:

有点晚了,但这不是更好的选择吗?

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

【讨论】:

  • 仅当使用低于 5.4 的 PHP 版本时。
【解决方案3】:

我知道这个问题很老,但以防万一有人偶然发现它。在撰写本文时,Laravel 是第 8 版,这是有效的:

在您的迁移中:

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

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

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 2021-02-27
    • 2020-12-06
    • 2016-11-26
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多