我有一个简单的MySQL函数用于比较版本:
CREATE FUNCTION `compareVersions` (
versionA VARCHAR(50),
versionB VARCHAR(50)) RETURNS INT DETERMINISTIC NO SQL
BEGIN
DECLARE a1 INT;
DECLARE b1 INT;
DECLARE c1 INT;
DECLARE d1 INT;
DECLARE a2 INT;
DECLARE b2 INT;
DECLARE c2 INT;
DECLARE d2 INT; SET a1 = SUBSTRING_INDEX( `versionA` , '.', 1 );
SET b1 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionA` , '.', 2 ),'.',-1);
SET c1 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionA` , '.', -2 ),'.',1);
SET d1 = SUBSTRING_INDEX( `versionA` , '.', -1 );
SET a2 = SUBSTRING_INDEX( `versionB` , '.', 1 );
SET b2 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionB` , '.', 2 ),'.',-1);
SET c2 = SUBSTRING_INDEX(SUBSTRING_INDEX( `versionB` , '.', -2 ),'.',1);
SET d2 = SUBSTRING_INDEX( `versionB` , '.', -1 );
IF (a1 > a2) THEN
RETURN -1;
ELSEIF ((a1 = a2) AND (b1 > b2)) THEN
RETURN -1;
ELSEIF ((a1 = a2) AND (b1 = b2) AND (c1 > c2)) THEN
RETURN -1;
ELSEIF ((a1 = a2) AND (b1 = b2) AND (c1 = c2) AND (d1 > d2)) THEN
RETURN -1;
ELSEIF ((a1 = a2) AND (b1 = b2) AND (c1 = c2) AND (d1 = d2)) THEN
RETURN 0;
ELSE
RETURN 1;
END IF;
END $$
创建时出现以下错误:
您没有SUPER权限,并且启用了二进制日志记录(您可能想使用不太安全的log_bin_trust_function_creators变量)
这几乎与此问题相同,但我的函数不读取任何SQL数据,它是简单、确定性的,我看不出为什么它需要任何额外的权限。从文档中我无法确定是否需要SUPER权限才能创建所有函数(这将是荒谬的,使存储函数对许多用户不可用,每个人都无法访问其数据库配置)。我甚至不知道这个函数是否有效,这是我想到的第一件事,但语法应该是正确的(在PHPMyAdmin中设置了分隔符)。可以通过在PHP应用程序中从数据库获取所有数据并进行比较来完成,但我认为这是最容易的方法。这可行吗?有没有更好的解决版本比较的方法?