MySQL用户授权失败时,先确认用户名大小写是否与mysql.user表中存储值完全一致,因User字段为大小写敏感的二进制字符串,'Admin'≠'admin';需用SELECT User,Host FROM mysql.user WHERE User='admin'精确匹配验证。

MySQL用户授权失败时,先确认是否启用了lower_case_table_names
MySQL默认在Linux上区分表名大小写,但user表中的User和Host字段本身不直接受该参数影响——真正关键的是客户端连接时传入的用户名是否与mysql.user表中存储的值完全一致(包括大小写)。很多授权失败其实源于:你执行了GRANT ... TO 'Admin'@'localhost',但应用却用admin去连。MySQL的User列是**大小写敏感的二进制字符串**(类型为CHAR(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin),哪怕只差一个大写A,就匹配不上。
验证方法:
SELECT User, Host FROM mysql.user WHERE LOWER(User) = 'admin';如果这条能查出结果,而
SELECT User, Host FROM mysql.user WHERE User = 'admin';查不到,说明库里存的是'Admin'或'ADMIN'。
检查mysql.user表中用户名的实际存储形式
不要依赖记忆或建库脚本里的写法,直接查表内容。注意三点:
-
User字段值是精确匹配的,'root'≠'Root'≠'ROOT' - 同一个用户名在不同
Host下算不同账户,'app'@'192.168.1.%'和'app'@'localhost'互不影响 - 使用
CREATE USER或GRANT时若未加引号,MySQL会自动转为小写(仅限于SQL解析阶段),但一旦显式用单引号写了'MyUser',就会原样存入
典型误操作:
CREATE USER MyUser@localhost IDENTIFIED BY 'pwd'; -- 解析后变成 'myuser'@'localhost'<br>CREATE USER 'MyUser'@localhost IDENTIFIED BY 'pwd'; -- 原样存为 'MyUser'@'localhost'后者会导致你必须用
mysql -uMyUser才能登录,-umyuser会报Access denied。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
连接时用户名大小写是否被客户端/驱动自动转换
部分客户端工具(如旧版MySQL Workbench、某些Java JDBC驱动配置)会在连接前把用户名强制转小写;而命令行mysql -u...则原样传递。这意味着:你在命令行用-uAdmin能连上,但Spring Boot用spring.datasource.username=Admin却失败,很可能是驱动做了标准化处理。
排查建议:
- 用
mysql --debug启动客户端,观察日志里实际发送的用户名 - 在MySQL服务端开启通用查询日志:
SET GLOBAL general_log = ON;,然后看general_log_file里记录的Connect事件中显示的用户名 - Java项目中可在JDBC URL加
?logger=com.mysql.cj.log.StandardLogger&profileSQL=true,查看实际认证请求
修复授权时避免大小写陷阱的实操原则
与其事后排查,不如从源头统一规范:
- 所有
CREATE USER和GRANT语句中,用户名**一律用小写+单引号**,例如CREATE USER 'reporter'@'%' IDENTIFIED BY '...'; - 禁止使用未加引号的用户名(即不用
CREATE USER reporter@'%'这种写法),防止SQL解析阶段意外转换 - 上线前用
SELECT User, Host FROM mysql.user ORDER BY User;人工扫一遍,确认没有混用大小写 - 若必须兼容历史大写账户,授权后立刻测试对应大小写的连接,不要假设“应该一样”
最常被忽略的一点:FLUSH PRIVILEGES不是万能的——它只重载权限缓存,但不会修正已存错的用户名。如果发现库里存了'Admin',得用RENAME USER 'Admin'@'%' TO 'admin'@'%';来修,而不是反复GRANT。

















