直接在phpmyadmin中手动插入bcrypt哈希值易失败,因特殊字符被截断或转义、字段长度不足60、字符集非utf8mb4、或哈希版本与laravel配置不匹配。

直接往 users 表插入 bcrypt() 哈希值会失败
PHPMyAdmin 里手动 INSERT 或 UPDATE 时,如果把 Laravel 的 bcrypt('password') 结果(比如 $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi)直接粘贴进 password 字段,大概率保存后登录失败。不是格式错,而是你很可能漏掉了关键前提:Laravel 默认用的是 bcrypt(),但它的哈希值长度固定为 60 字符,且必须以 $2y$、$2a$ 或 $2b$ 开头——而部分旧版 PHP 或 MySQL 配置会截断或转义特殊字符(尤其是 $ 和 /),导致存进去的值被破坏。
实操建议:
- 在 PHPMyAdmin 的 SQL 标签页执行插入,**不要用表单界面的“插入”按钮**(它对特殊字符处理不稳)
- 用单引号包裹哈希值,并确保整个字符串完整无换行:
INSERT INTO `users` (`name`, `email`, `password`, `created_at`) VALUES ('admin', 'admin@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', NOW()); - 如果报错
Incorrect string value,检查password字段是否为VARCHAR(60)且字符集是utf8mb4(不是utf8)
用 Laravel 的 Hash::make() 生成再复制最稳妥
自己手算 bcrypt 容易出错,尤其密钥轮数、盐值、版本标识不匹配。Laravel 的 Hash::make() 会自动选当前环境支持的最佳配置(默认 $2y$ + 10 轮),且结果可直接用于数据库。
做法很简单:
- 临时在 Laravel 项目里加个测试路由或 Artisan 命令,运行:
use Illuminate\Support\Facades\Hash;<br>echo Hash::make('your_password_here'); - 复制输出的完整 60 字符哈希串(含开头的
$2y$...) - 回到 PHPMyAdmin,用上面提到的 SQL 方式插入或更新
- 别用在线 bcrypt 工具——很多工具默认用
$2a$或$2b$,而 Laravel 5.8+ 强制要求$2y$兼容性,混用会导致验证失败
字段类型和长度必须是 VARCHAR(60)
很多人设成 VARCHAR(255) 图省事,但其实没必要,反而容易掩盖问题。Laravel 的 bcrypt() 输出严格固定为 60 字符,多一个空格、少一个 $ 都不行。
检查并修正方式:
- 在 PHPMyAdmin 中点开
users表结构,找到password字段 - 如果类型不是
VARCHAR(60),点击「结构」→「更改」→ 把长度改成60 - 字符集务必选
utf8mb4,排序规则选utf8mb4_unicode_ci(utf8不支持 4 字节 Unicode,可能吞掉哈希里的字节) - 如果已有数据被截断过,清空该字段再重插,别试图修补
插入后登录仍失败?先确认 Laravel 没改默认哈希驱动
有些项目为了兼容老系统,会在 config/hashing.php 里把 'driver' => 'bcrypt' 改成 'argon2id' 或自定义驱动。这时你插进去的 bcrypt 哈希就完全不匹配了。
快速验证方法:
- 打开
config/hashing.php,确认'driver'是'bcrypt' - 或者在代码里临时 dump:
dd(config('hashing.driver')); - 如果用了
argon2id,就不能插 bcrypt 哈希,得用Hash::make()重新生成(它会按当前配置自动适配) - 另外检查
App\Models\User是否重写了getAuthPassword()或修改了密码字段名(比如叫passwd而非password)
$ 的哈希时可能被悄悄处理。只要坚持用纯 SQL 语句、字段长度卡死 60、哈希来源锁定 Hash::make(),基本不会翻车。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











