mysql --version查客户端版本,mysqld --version查服务端主程序版本;二者均不连接数据库、不读配置、不反映实际运行的服务端状态,仅显示各自二进制文件的版本号。

mysql --version 和 mysqld --version 查的是什么
这两个命令分别查客户端和服务器二进制文件的版本,但都不连数据库、不读配置、不反映实际运行的服务端状态。mysql --version(或等价的mysql -V)输出形如 mysql Ver 8.0.33 for Linux on x86_64 (MySQL Community Server),其中 8.0.33 是你本地 mysql 命令的版本;mysqld --version 必须在服务端机器上执行,输出类似 mysqld Ver 8.0.35 for Linux on x86_64 (MySQL Community Server),对应的是 mysqld 主程序版本。
常见错误是以为 mysql --version 能代表你连接的服务器版本——其实它完全无关远程目标,比如你在本地用 8.0 客户端连一台 5.7 的服务器,这个命令仍只显示 8.0。
- Windows 下若提示
'mysql' is not recognized,说明没加到PATH,需先cd到 MySQL 的bin/目录再运行 - Docker 场景下,
mysql --version显示的是镜像里打包的客户端版本,不是宿主机或目标服务器的版本 -
mysqld --version不显示编译参数,只给主版本号和发行标识
SELECT VERSION() 和 SELECT @@version 哪个更可靠
登录 MySQL 后执行 SELECT VERSION() 或 SELECT @@version,返回的才是当前连接实例的真实服务端版本。二者结果通常一致(如 8.0.32),但行为有关键差异:
-
SELECT VERSION()是函数调用,在极少数托管环境(如部分云数据库、MySQL Router 后端)可能被禁用,报错ERROR 1370 (42000): execute command denied to user -
SELECT @@version访问只读系统变量,权限要求更低,只要能执行SELECT就大概率成功 - 旧版 MySQL(如 5.5)不支持
@@version,此时必须用VERSION() - 两者都不含编译参数,只提供主版本字符串;若要区分 MySQL Community Server 和 Percona Server,得看
@@version_comment
如何查编译参数(如 SSL、字符集)
MySQL 自身不提供“一键导出全部编译选项”的命令,但可通过系统变量获取部分关键信息:
- 运行
SHOW VARIABLES LIKE 'version_compile%';,会返回version_compile_os、version_compile_machine等字段 - 等价写法:
SELECT @@version_compile_os, @@version_compile_machine; - 这些变量告诉你编译时的目标操作系统和 CPU 架构,但不包含 CMake 参数(如
-DWITH_SSL=system或-DDEFAULT_CHARSET=utf8mb4) - 真要确认 SSL 是否启用,应查
SHOW VARIABLES LIKE 'have_ssl';或SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'have_ssl';
STATUS 命令为什么比单条 SQL 更实用
登录后输入 STATUS(或简写 \s),终端一次性打印客户端和服务端双版本、连接 ID、当前数据库、SSL 状态、字符集等关键上下文,比单独查 VERSION() 更省事也更防错:
- 如果输出里没有
Server version:行,说明连接失败,或当前用户无USAGE权限(不是版本问题,而是权限或网络问题) - 欢迎信息里的
Server version: 8.0.32是登录时自动显示的,但容易被后续输出刷掉;STATUS每次都能稳定定位 - 它还会显示
Connection id:、Current user:、SSL:等运维关键字段,一屏全览 - 注意:某些精简 shell(如 mysqlsh 的 JavaScript 模式)不支持
STATUS,只认 SQL 语句
最易被忽略的点是客户端和服务端版本差一个大版本(比如客户端 8.0,服务端 5.7),mysql 命令仍可能连上,但部分语法(如 JSON_TABLE)或认证插件(caching_sha2_password)会静默失效——这时光看客户端版本毫无意义,必须靠 STATUS 或 SELECT @@version 确认服务端真实版本。











