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

Laravel 9+MySQL环境下如何实现ADID字段大小写敏感的唯一约束?

解决Laravel 9中MySQL唯一约束区分大小写的问题

你的问题核心在于当前使用的utf8mb4_unicode_ci排序规则是大小写不敏感的,导致MySQL会将大小写不同的ADID判定为重复值,触发唯一约束拦截。要解决这个问题,只需要修改adid字段的排序规则为大小写敏感的类型即可,具体步骤如下:

1. 修改数据库迁移文件

情况一:新建devices表

如果是还未创建表,在迁移文件中定义adid字段时,直接指定大小写敏感的排序规则(推荐utf8mb4_bin,兼容性更好):

Schema::create('devices', function (Blueprint $table) {
    // 其他字段定义...
    $table->string('adid')->unique()->collate('utf8mb4_bin');
});

情况二:已有devices表

如果表已经存在,创建一个新的迁移文件来修改字段的排序规则:

php artisan make:migration modify_adid_collation_on_devices_table

然后在生成的迁移文件中写入:

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('devices', function (Blueprint $table) {
            $table->string('adid')->unique()->collate('utf8mb4_bin')->change();
        });
    }

    public function down()
    {
        Schema::table('devices', function (Blueprint $table) {
            // 回滚时恢复原排序规则
            $table->string('adid')->unique()->collate('utf8mb4_unicode_ci')->change();
        });
    }
};

2. 执行迁移

运行迁移命令使修改生效:

php artisan migrate

原理说明

utf8mb4_bin是按字符的二进制值进行比较的排序规则,大小写字母的二进制编码不同,因此MySQL会将NOTAREALADID和notarealadid判定为两个不同的值,唯一约束就不会触发拦截。

完成上述修改后,你执行两次Devices::create操作时,两个大小写不同的ADID就能正常存储了。

内容的提问来源于stack exchange,提问作者Drew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:50:26