1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
DELIMITER // CREATE DEFINER=`root`@`localhost` FUNCTION `FN_IdCardNo15To18`( `v_card` VARCHAR(32) ) RETURNS varchar(32) CHARSET utf8mb4 NO SQL BEGIN DECLARE v_sum varchar(32) DEFAULT ''; -- 校验第一步求和 DECLARE v_mod varchar(32) DEFAULT ''; -- 校验第二步取余 DECLARE i_flag varchar(32) DEFAULT ''; -- 校验第三步计算校验位 DECLARE i_card varchar(32) DEFAULT ''; -- 身份证号 -- 去空格 SET v_card = REPLACE(v_card,' ',''); -- 为空则返回空 IF v_card='' THEN RETURN ''; END if; -- 非15位直接返回 IF LENGTH(v_card)!=15 THEN RETURN v_card; END IF; -- 补充成17位 SET v_card = CONCAT(SUBSTRING(v_card,1,6),'19',SUBSTRING(v_card,7,9)); -- 判断校验位 SET v_sum= (SUBSTRING(v_card,1,1)*7)+ (SUBSTRING(v_card,2,1)*9)+ (SUBSTRING(v_card,3,1)*10)+ (SUBSTRING(v_card,4,1)*5)+ (SUBSTRING(v_card,5,1)*8)+ (SUBSTRING(v_card,6,1)*4)+ (SUBSTRING(v_card,7,1)*2)+ (SUBSTRING(v_card,8,1)*1)+ (SUBSTRING(v_card,9,1)*6)+ (SUBSTRING(v_card,10,1)*3)+ (SUBSTRING(v_card,11,1)*7)+ (SUBSTRING(v_card,12,1)*9)+ (SUBSTRING(v_card,13,1)*10)+ (SUBSTRING(v_card,14,1)*5)+ (SUBSTRING(v_card,15,1)*8)+ (SUBSTRING(v_card,16,1)*4)+ (SUBSTRING(v_card,17,1)*2); -- 求余 SET v_mod = v_sum % 11; -- 补位 IF v_mod = 0 THEN SET i_flag = '1'; END IF; IF v_mod = 1 THEN SET i_flag = '0'; END IF; IF v_mod = 2 THEN SET i_flag = 'X'; END IF; IF v_mod = 3 THEN SET i_flag = '9'; END IF; IF v_mod = 4 THEN SET i_flag = '8'; END IF; IF v_mod = 5 THEN SET i_flag = '7'; END IF; IF v_mod = 6 THEN SET i_flag = '6'; END IF; IF v_mod = 7 THEN SET i_flag = '5'; END IF; IF v_mod = 8 THEN SET i_flag = '4'; END IF; IF v_mod = 9 THEN SET i_flag = '3'; END IF; IF v_mod = 10 THEN SET i_flag = '2'; END IF; SET i_card = CONCAT(v_card,i_flag); RETURN i_card; END// DELIMITER ; |