$email = strtolower(trim($_POST['email']));
// 统一排序规则,避免大小写各存一行
// ALTER TABLE wp_users MODIFY user_email VARCHAR(100) COLLATE utf8mb4_unicode_ci;

用户用 Alice@Example.com 注册过一次,后来用 alice@example.com 又注册成功,后台两条记录只差大小写,找回密码时只有一个能收到信。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,唯一索引按原样比较,数据库排序规则区分大小写时,两个写法就是两行。应用层写入前也没做 strtolower,等于把格式差异留给了数据库。

围绕「邮箱大小写归一」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:注册和登录入口统一把邮箱转小写再去空格,写库前只做这一次归一;存量数据先跑一遍排查,把重复账号列出来人工合并;唯一索引建在归一后的字段上,别指望调用方自觉;用大小写混合的邮箱再注册一次,确认提示已存在。

改完只确认一件事:用大写邮箱注册会提示已存在,登录时大小写随便写都能进同一个账号。

作者 9823189