session 表乱码因未设 utf8mb4_bin 排序规则,laravel 9+ 默认加密导致 data 字段为 aes 密文,user_id 非自动填充需 auth::login() 触发,查会话应按 laravel_session cookie id 过滤,且需加 expires 时间条件防膨胀。
session 表里字段乱码,查不到真实数据
laravel 默认用 serialize() 存 session,但数据库字段是 text 或 mediumtext,且没设 utf8mb4_bin 排序规则,导致 phpmyadmin 显示一堆不可读字符(比如 a:2:{s:6:"_token" 开头的二进制流)。这不是加密,是 php 序列化后的原始字节直接入库。
实操建议:
- 确认
sessions表的data字段使用utf8mb4_bin排序规则(不是utf8mb4_unicode_ci),否则 phpMyAdmin 会错误尝试 UTF-8 解码 - 在 phpMyAdmin 中点击该字段值 → 右上角「编辑」→ 勾选「十六进制」再查看,能看清原始序列化结构
- 别直接改表结构加
CHARSET=utf8mb4,必须连同COLLATE=utf8mb4_bin一起执行:ALTER TABLE sessions MODIFY data TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Laravel 9+ 的 session 数据无法直接 unserialize()
从 Laravel 9 开始,默认启用 encrypt 会话驱动(即使你配的是 database),data 字段内容其实是 AES 加密过的二进制 blob,不是裸序列化字符串。直接 unserialize() 会报 unserialize(): Error at offset 0。
实操建议:
- 检查
config/session.php中'encrypt' => true是否开启(Laravel 9+ 默认为true) - 若需人工解析,得先解密:用应用的
APP_KEY和APP_CIPHER(默认AES-128-CBC)调用Illuminate\Encryption\Encrypter解密后再unserialize() - 临时调试更简单:把
'encrypt' => false改成false,清空storage/framework/sessions/和数据库sessions表,重启服务——此时data才是可读序列化内容
phpMyAdmin 查 session 时看不到当前用户的数据
常见现象:登录后查 SELECT * FROM sessions WHERE user_id = 123 返回空,但确认已登录。问题出在 Laravel 的 session 行为逻辑:它不总写 user_id,只在调用 Auth::login() 且配置了 session()->put('login_id', $user->id) 这类手动操作时才存;默认只存 _token、url.intended 等键。
实操建议:
- 查当前活跃 session,优先用
SELECT * FROM sessions WHERE id = 'xxx',其中xxx是浏览器 Cookie 中laravel_session的值(F12 → Application → Cookies) - 想关联用户,确保
config/auth.php中'providers.users.model'对应的 User 模型实现了getAuthIdentifierName(),并确认数据库users表有id字段 - Session 表的
user_id字段是 Laravel 自动填充的,前提是用了Auth::login($user)且$user实现了Authenticatable接口
直接 SELECT * FROM sessions 返回太多旧记录
Session 表容易膨胀,Laravel 不自动清理过期 session(除非你配了 gc_probability 且触发了 GC),phpMyAdmin 一次加载全部会让页面卡死或超时。
实操建议:
- 加时间过滤:
SELECT * FROM sessions WHERE expires > UNIX_TIMESTAMP() ORDER BY expires DESC LIMIT 50;
- 别依赖
created_at或updated_at—— Laravel 数据库 session 驱动默认不写这两个字段,除非你手动加了迁移和监听器 - 定期清理:用 Artisan 命令
php artisan session:table生成迁移后,建议配合 cron 每小时跑一次DELETE FROM sessions WHERE expires
Session 解析真正的难点不在 SQL 查询,而在理解 Laravel 版本差异带来的加密开关、序列化格式变化,以及 phpMyAdmin 对二进制字段的显示限制。跳过版本确认就动手 decode,大概率看到一堆问号或报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











