You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Sail带重音词查询失效问题求助

解决Laravel Sail中带重音词汇的LIKE查询失效问题

问题根源在于你使用的utf8mb4_unicode_ci排序规则是不区分重音(accent-insensitive)的,MySQL执行LIKE查询时会自动忽略重音标记,将é和e视为等价字符,导致搜索éz时匹配到ez相关结果。

以下是两种可行的解决方案:

方案一:临时修改查询的排序规则(无需改表结构)

在查询中通过whereRaw指定字段使用区分重音的排序规则,比如utf8mb4_bin(二进制比较,严格区分字符)或utf8mb4_0900_as_cs(MySQL 8.0+推荐,区分重音和大小写,语义更合理):

// 使用utf8mb4_bin
Client::query()->whereRaw("disposition LIKE ? COLLATE utf8mb4_bin", ["%" . "éz" . "%"]);

// MySQL 8.0+优先使用utf8mb4_0900_as_cs
Client::query()->whereRaw("disposition LIKE ? COLLATE utf8mb4_0900_as_cs", ["%" . "éz" . "%"]);

方案二:永久修改字段排序规则(全局生效)

通过Laravel迁移修改disposition字段的排序规则,后续所有查询都会默认区分重音:

1. 创建迁移文件

php artisan make:migration update_disposition_collation_on_clients_table

2. 在迁移文件中修改字段排序规则

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::table('clients', function (Blueprint $table) {
            // 替换为你需要的区分重音的排序规则
            $table->string('disposition')->collate('utf8mb4_0900_as_cs')->change();
        });
    }

    public function down()
    {
        Schema::table('clients', function (Blueprint $table) {
            // 回滚到原排序规则
            $table->string('disposition')->collate('utf8mb4_unicode_ci')->change();
        });
    }
};

3. 执行迁移

php artisan migrate

注意:utf8mb4_0900_as_cs是MySQL 8.0及以上版本支持的排序规则,如果你使用的是旧版本MySQL,可改用utf8mb4_bin替代。

内容的提问来源于stack exchange,提问作者Tamás László

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:23:17