-- Function: `hhit_assetlocate`.`convertCpeVer` -- Source database: hhit_assetlocate -- Generated from OceanBase (MySQL mode) USE `hhit_assetlocate`; DROP FUNCTION IF EXISTS `convertCpeVer`; DELIMITER $$ CREATE DEFINER = `root`@`%` FUNCTION `convertCpeVer`(str VARCHAR(255), maxLen INT(10)) RETURNS bigint(20) unsigned BEGIN DECLARE i INT DEFAULT 1; DECLARE len INT DEFAULT 0; DECLARE result VARCHAR(255) DEFAULT ''; DECLARE ch CHAR(1); DECLARE word VARCHAR(255) DEFAULT ''; DECLARE is_word BOOLEAN DEFAULT FALSE; DECLARE digit_group VARCHAR(255) DEFAULT ''; DECLARE is_digit BOOLEAN DEFAULT FALSE; -- 清理不需要的文本 SET str = REPLACE(str, 'Vendor: Red Hat, Inc.', ''); SET str = REPLACE(str, 'Vendor: CentOS', ''); SET str = REPLACE(str, ' ', ''); -- 替换特殊标识符为数字(保持语义) SET str = REPLACE(str, 'dev', '1'); SET str = REPLACE(str, 'alpha', '2'); SET str = REPLACE(str, 'beta', '3'); SET str = REPLACE(str, 'pre', '4'); SET str = REPLACE(str, 'RC', '5'); SET str = REPLACE(str, 'rc', '6'); SET str = REPLACE(str, '#', '7'); SET str = REPLACE(str, 'pl', '8'); SET str = REPLACE(str, 'p', '9'); SET str = REPLACE(str, 'stable', '1'); SET str = REPLACE(str, 'build', '2'); -- 删除下划线和连字符(这些通常只是分隔符) SET str = REPLACE(str, '_', ''); SET str = REPLACE(str, '-', ''); -- 删除括号 SET str = REPLACE(str, '(', ''); SET str = REPLACE(str, ')', ''); -- 关键修正:保留点号作为分隔符,但删除多余的V前缀 SET str = REPLACE(str, 'V', ''); -- 删除版本号前的V -- 现在str应该是类似 "2.3.29" 或 "2.32.9" 的格式 SET len = LENGTH(str); -- 如果太长,只取最后24个字符(但要注意不要截断数字) IF len > 24 THEN SET str = RIGHT(str, 24); SET len = 24; END IF; WHILE i <= len DO SET ch = SUBSTRING(str, i, 1); -- 如果是数字 IF ch REGEXP '^[0-9]$' THEN SET digit_group = CONCAT(digit_group, ch); SET is_digit = TRUE; ELSE -- 如果之前累积了数字组,先处理 IF is_digit THEN -- 将数字组转换为固定长度的字符串(例如每位数字保持不变,或者用特殊方式编码) SET result = CONCAT(result, LPAD(digit_group, 3, '0')); -- 每组数字固定3位 SET digit_group = ''; SET is_digit = FALSE; END IF; -- 添加分隔符(保留点号作为分隔) IF ch = '.' THEN SET result = CONCAT(result, '.'); END IF; END IF; SET i = i + 1; END WHILE; -- 处理最后一个数字组 IF is_digit THEN SET result = CONCAT(result, LPAD(digit_group, 3, '0')); END IF; SET result = REPLACE(result, '.', ''); -- 如果结果长度不足maxLen,补零 IF LENGTH(result) < maxLen THEN SET result = CONCAT(result, REPEAT('0', maxLen - LENGTH(result))); END IF; IF LENGTH(result) > maxLen THEN SET result = SUBSTRING(result, 1, maxLen); END IF; RETURN CAST(result AS UNSIGNED); END $$ DELIMITER ;