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

