php 检查MariaDB / MySQL中是否存在(内部)函数/功能/命令

ewm0tg9j  于 2023-05-27  发布在  PHP
关注(0)|答案(1)|浏览(186)

我在我的应用程序中使用MEDIAN函数。当我在生产服务器上部署它时,我得到Syntax error,因为有一个旧版本的MariaDB。
有没有办法检查某个函数是否存在?PHP中的function_exists()
我可以像这样检查SELECT VERSION();的版本,并维护一些函数和版本的列表。但我在寻找更简单更通用的解决方案。
现在我这样做:

// PHP + NETTE framework

$sqlVersionOK = $this->checkSqlServerVersion([10,3,3]); 

if ($sqlVersionOK) { /* ... */ } else { /* ... */ }

public function checkSqlServerVersion(array $nums):bool {
    
    $version = $this->repository->query('SELECT VERSION() AS num;')->fetch();

    $version = explode('.', $version->num);
    $ver = array_map(function ($item) { return (int) filter_var($item, FILTER_SANITIZE_NUMBER_INT); }, $version);
    
    if ($ver[0] > $nums[0]) { return TRUE; } // major number is bigger
    elseif($ver[0]==$nums[0] and $ver[1] >= $nums[1]) { return TRUE; } // major number is the same, minor is bigger or same
    elseif($ver[0]==$nums[0] and $ver[1] == $nums[1] and $ver[2] >= $nums[1]) { return TRUE; } // major and minor numbers are the same, patch is bigger or same
    else { return FALSE; } 
    
}

谢谢。

ergxz8rk

ergxz8rk1#

10.6添加了information_schema.keywords,但是它对你来说还不够早。(我不确定它是否包含所有功能)。
给定MEDIAN是10.3+窗口函数,并且仅在10.2中添加的窗口函数给出了非常有限的窗口(双关语),可以找到替代。
Stored aggregate functions仅在10.3中添加,因此不可能在10.2中创建等效的SQL函数。
MariaDB有一个executable comment syntax,其中一些函数只有在服务器具有足够的版本时才会执行,例如:

/*M!100303 SELECT MEDIAN(star_rating) OVER (PARTITION BY name) FROM book_rating */

这将是10.2示例上的空查询。
一个更务实的答案是:

  • 在生产环境中运行与测试/开发环境相同的版本
  • 即使是10.3也刚刚结束了上游维护,所以抓住机会升级到一个新版本并获得所有好处,而不必花费太多时间在未维护的软件上编写替代代码。

相关问题