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ó
相关产品推荐
相关产品推荐

