Php 使用utf8mb4(Laravel)的不区分大小写的SQL查询

Php 使用utf8mb4(Laravel)的不区分大小写的SQL查询,php,sql,laravel,character-encoding,utf8mb4,Php,Sql,Laravel,Character Encoding,Utf8mb4,我正在尝试创建一个只允许创建唯一用户名的帐户系统。SQL查询过去不区分大小写,但将字符集更改为utf8mb4后,它区分大小写,这意味着人们可以使用重复的用户名。(我改为utf8mb4以允许在用户bios中使用表情符号和其他符号,因此无法恢复到旧字符集) 我已尝试更改连接排序规则,但每次尝试都会出现错误500。我需要一些不需要我在每个查询中添加“strtolower($username)”的东西 查询示例: if(DB::table('users')->where('username',$user

我正在尝试创建一个只允许创建唯一用户名的帐户系统。SQL查询过去不区分大小写,但将字符集更改为utf8mb4后,它区分大小写,这意味着人们可以使用重复的用户名。(我改为utf8mb4以允许在用户bios中使用表情符号和其他符号,因此无法恢复到旧字符集)

我已尝试更改连接排序规则,但每次尝试都会出现错误500。我需要一些不需要我在每个查询中添加“strtolower($username)”的东西

查询示例:

if(DB::table('users')->where('username',$username)->count()>0){
return response()->json(['status'=>'error','message'=>'Username is take']);
}
SQL配置:

'mysql'=>[
“驱动程序”=>“mysql”,
'host'=>env('DB_host','localhost'),
'port'=>env('DB_port','3306'),
'database'=>env('DB_database','forge'),
'username'=>env('DB_username','forge'),
'password'=>env('DB_password',''),
'unix_socket'=>env('DB_socket',''),
“字符集”=>“utf8mb4”,
“排序规则”=>“utf8mb4\u unicode\u ci”,
'前缀'=>'',
“严格”=>正确,
“引擎”=>null,
],
当用户尝试使用重复用户名时,服务器应返回:

{'status':'error',message':'Username's take'}

但是用户实际上可以创建一个帐户。

您可以在模型中定义一个帐户。每次要存储数据时都会调用此方法:

类用户扩展模型
{
/**
*以小写形式设置用户的用户名。
*
*@param字符串$value
*@返回无效
*/
公共函数setUsernameAttribute($value)
{
$this->attributes['username']=strtolower($value);
}
}
现在,如果您在迁移中将该列声明为
unique
(如下所示):

Schema::create('users',函数(Blueprint$表){
// ...
$table->string('username')->unique();
});
然后,它将抛出异常错误,因为它将检测到系统正在尝试创建重复记录。因此,只需处理此异常即可向用户返回正确的响应

使用light\Database\QueryException;
// ...
尝试
{
$user=user::create($data);
}
捕获(查询异常$e)
{
$errorCode=$e->errorInfo[1];
如果($errorCode==1062)
{
return response()->json(['status'=>'error','message'=>'Username is take']);
}
}
但是,你需要在每一个地方都添加这个。。所以只要把它加进去,你就可以走了



注意:我利用了来详细说明我的答案。

通过将所有表排序规则更改为
utf8mb4\u unicode\u ci
进行修复

ALTER TABLE转换为字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci;

请提供
SHOW CREATE TABLE
和一对有问题的用户名示例。我已经很久没有使用Laravel了,所以我不确定我应该做什么。这是否意味着我必须替换所有查询?或者对所有查询都不区分大小写?还有,我有更多的表有这个问题,有没有办法改变字符集,使其不区分大小写,但仍然允许特殊字符?