最可靠的是 SELECT @@version; 或 SELECT VERSION(); 返回服务端主版本号如 8.0.33,它决定权限模型、默认认证插件及语法兼容性;STATUS; 或 \s 可补充协议版本等元数据;mysql -V 和 mysqld --version 仅反映客户端或本地二进制版本,非实际服务端版本。

直接看 MySQL 服务端版本(最常用、最可靠)
你真正该关心的不是客户端或安装包版本,而是正在运行的 MySQL 服务端版本——它决定了权限模型(比如是否支持 ROLE、password_history、mysql.user 表结构)、默认认证插件(caching_sha2_password vs mysql_native_password)以及权限语法兼容性。
-
SELECT @@version;或SELECT VERSION();:返回服务端主版本号,如8.0.33;这是脚本里最稳妥的查询方式,不依赖连接状态以外的任何上下文 - 登录后第一行欢迎信息里明确写着
Server version: 8.0.33,但容易被快速滚动忽略 -
STATUS;或简写\s:不仅显示Server version,还附带Protocol version和MySQL Community Server等元数据,对排查权限兼容问题(比如旧客户端连不上新服务端)很有用
区分 mysql 客户端和 mysqld 服务端版本(别搞混了)
本地装了 MySQL,不代表你连的是本地服务;远程连了云数据库,mysql -V 显示的只是你本机客户端版本,跟服务器权限系统毫无关系——这是最常见的误判点。
-
mysql -V(大写 V):查你本地mysql命令行工具版本,输出类似mysql Ver 15.1 Distrib 8.0.33;仅反映客户端能力(比如是否支持--set-gtid-purged) -
mysqld --version:查本机已安装的 MySQL 服务二进制文件版本,但不保证它正在运行,也不代表你当前连接的那个实例 - 远程连接时,
mysql -h xxx -P 3306 -u root -p登录后执行SELECT @@version;才是真实答案
通过系统变量确认权限相关元数据(查清楚“权限系统”本身)
MySQL 8.0+ 的权限模型和 5.7 差异极大,光知道 8.0.33 不够,得确认它用的是哪套权限底层逻辑。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
SHOW VARIABLES LIKE 'default_authentication_plugin';:返回caching_sha2_password还是mysql_native_password,直接影响用户能否登录、密码是否被拒绝 -
SELECT plugin FROM mysql.user WHERE User='root';:验证具体用户的认证插件,避免「改了全局 default 却忘了刷用户」 -
SHOW VARIABLES LIKE 'old_passwords';:在 5.7 及更早版本中控制密码哈希方式,8.0 已移除,若查到非空值说明环境异常或降级残留
不联网/未启动服务时能做什么(应急场景)
服务崩了、容器没起来、或者你只有只读访问权限,这时候无法执行 SQL,但仍有线索可挖。
-
mysql --help | grep "Distrib"(Linux/macOS)或mysql --help | findstr "Distrib"(Windows):从帮助文本里捞出客户端打包的 MySQL 分发版信息,虽非服务端版本,但至少知道安装包基线 - 查看 MySQL 数据目录下的
VERSION文件(路径如/var/lib/mysql/VERSION或C:\ProgramData\MySQL\MySQL Server 8.0\Data\VERSION):部分发行版会写入此文件,内容为纯文本版本号,但非官方标准,不一定存在 - 检查 systemd 或 docker logs:比如
journalctl -u mysql | head -n 20,启动日志第一行通常打印mysqld ... version 8.0.33
权限系统的版本不是独立存在的,它和 mysqld 二进制、数据字典初始化方式、甚至 mysql_upgrade 是否执行过都绑在一起。只记一个 SELECT VERSION() 不够,得养成看 STATUS + SHOW VARIABLES LIKE '%auth%' 的习惯。










