【问题标题】:Where does PDO version attribute come from?PDO 版本属性从何而来?
【发布时间】:2019-12-21 02:55:15
【问题描述】:

我为 PDO 数据库驱动程序返回了不同的版本字符串,我认为应该是相同的。在 PHP 中调用 this 获取版本:

Database::getConnection()->version()

内部是这样做的:

$this->getAttribute(PDO::ATTR_SERVER_VERSION)

所以它正在获取 PDO 驱动程序的ATTR_SERVER_VERSION。我用的驱动是mysql,在Linux上。

在一台运行 PHP 5.6 的机器上,它返回 10.2.26-MariaDB-log

在另一台运行 PHP 7.2 的机器上,它返回 5.5.5-10.2.26-MariaDB

两者都有 MariaDB 10.2.26。我不知道 PHP 是否是它们不同的原因。版本字符串会这样不同是有原因的吗?

【问题讨论】:

    标签: php mysql pdo mariadb


    【解决方案1】:

    这实际上来自数据库。深入研究源代码,我看到ATTR_SERVER_VERSION 实际上调用了ZVAL_STRING(return_value, (char *)mysql_get_server_info(H->server));。对https://www.php.net/manual/en/function.mysql-get-server-info.php 的评论说和

    SELECT VERSION() as mysql_version
    

    当我尝试时,我发现它们匹配。

     $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
    // '5.7.24-0ubuntu0.18.04.1'
    
    mysql> select version();
    +-------------------------+
    | version()               |
    +-------------------------+
    | 5.7.24-0ubuntu0.18.04.1 |
    +-------------------------+
    

    MySQL 版本命令说:

    返回一个表示 MySQL 服务器版本的字符串。该字符串使用 utf8 字符集。除了版本号之外,该值可能还有一个后缀。请参阅第 5.1.7 节“服务器系统变量”中对版本系统变量的描述。

    -- version

    服务器的版本号。该值还可能包括指示服务器构建或配置信息的后缀。 -log 表示启用通用日志、慢查询日志或二进制日志中的一种或多种。 -debug 表示服务器是在启用调试支持的情况下构建的

    MariaDB,来自 MySQL,has the same version variable

    描述:服务器版本号。它还可能包含一个后缀 配置或构建信息。 -debug 表示调试支持 已在服务器上启用,并且 -log 指示至少一个 启用二进制日志、通用日志或慢查询日志,例如 10.0.1-MariaDB-mariadb1precise-log。从 MariaDB 10.2.1 开始,可以在启动时设置此变量以伪造服务器版本。

    命令行:-V、--version[=name] (>= MariaDB 10.2.1)、--version (

    范围:全球

    动态:否

    类型:字符串

    至于服务器之间的不匹配,这是 MariaDB 为解决复制服务器问题而添加的,但大多数客户端会将其删除。 src from GitHub issue

    MySQL复制slave代码决定master可以做什么(binlog 格式等)通过查看发送的版本的第一个字符 在握手包中。当 MariaDB 10.0 版本时,MySQL slaves 启动 认为它是版本 1,并拒绝从它复制。

    作为一种解决方法,我们实施了这个版本前缀。 MariaDB 发送 握手包中不可能的组合——版本 能力字段中的“5.5.5”和“支持身份验证插件”。 MariaDB 客户端库检测到并透明地删除 假的版本前缀。

    当然,如果您链​​接不支持 mariadb 的客户端库,则 前缀不会被删除,您会在应用程序中看到它。

    【讨论】:

    • 非常好的答案!你知道我前面看到的5.5.5- 是什么吗?当我运行SELECT VERSION() as mysql_version 时,我看不到那部分,但我在 PHP 中看到了。会不会是驱动版本?
    • 我不这么认为,因为 PHP 似乎根本没有修改字符串。不过,这有点像兔子洞,所以我不确定。
    • 找到了答案。显然它来自数据库,但version() 将其删除。它在那里修复复制从属问题。 github.com/joomla/joomla-cms/issues/9062#issuecomment-184742936
    • 当然,如果你链接到不支持 mariadb 的客户端库,前缀不会被删除,你会在应用程序中看到它。 非常好。考虑将链接编辑到您的答案中,而不仅仅是作为评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多