利用SQL进行身份证号码校验
在实际项目中,我们有时可能需要对人员的身份证号码的真实性进行测试,为此我们需要掌握身份证号码的校验原理以及测试的方法。
身份证校验原理:
身份证号码中的校验码是身份证号码的最后一位,是根据GB 11643-1999中有关公民身份号码的规定,根据精密的计算公式计算出来的,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。
(1)身份证号码的组成:AAAAAA-YYYYMMDD-CCC-X
6位数字地址码 + 8位数字出生日期码 + 3位数字顺序码 + 1位数字校验码
(2)身份证第 1-17 位分别乘以对应的权重因子:

(3)将乘积之和取模 11(即除以 11 取余数),然后根据下表得到对应的第 18 位校验码

其中 X 其实代表的是 10;身份证号码第 17 位代表性别,奇数为男性,偶数为女性。
测试案例:
这里我们以2022年06月09日公安部发布A级通缉令公开通缉12名电信网络诈骗集团重大头目和骨干人员的三名人员为例,来测试身份证的校验值。

具体测试SQL语句如下:
WITH xx AS(
SELECT idcard,(
SUBSTRING(idcard,1,1)*7 +
SUBSTRING(idcard,2,1)*9 +
SUBSTRING(idcard,3,1)*10 +
SUBSTRING(idcard,4,1)*5 +
SUBSTRING(idcard,5,1)*8 +
SUBSTRING(idcard,6,1)*4 +
SUBSTRING(idcard,7,1)*2 +
SUBSTRING(idcard,8,1)*1 +
SUBSTRING(idcard,9,1)*6 +
SUBSTRING(idcard,10,1)*3 +
SUBSTRING(idcard,11,1)*7 +
SUBSTRING(idcard,12,1)*9 +
SUBSTRING(idcard,13,1)*10 +
SUBSTRING(idcard,14,1)*5 +
SUBSTRING(idcard,15,1)*8 +
SUBSTRING(idcard,16,1)*4 +
SUBSTRING(idcard,17,1)*2) % 11 AS '校验和模值'
FROM tongji)
SELECT idcard, RIGHT(idcard,1) AS '身份证校验值',
CASE WHEN 校验和模值 = 0 THEN '1'
WHEN 校验和模值 = 1 THEN '0'
WHEN 校验和模值 = 2 THEN 'X'
WHEN 校验和模值 = 3 THEN '9'
WHEN 校验和模值 = 4 THEN '8'
WHEN 校验和模值 = 5 THEN '7'
WHEN 校验和模值 = 6 THEN '6'
WHEN 校验和模值 = 7 THEN '5'
WHEN 校验和模值 = 8 THEN '4'
WHEN 校验和模值 = 9 THEN '3'
WHEN 校验和模值 = 10 THEN '2'
ELSE '其他'
END
AS '审计校验值'
FROM xx;
测试结果:

可以看到,身份证校验值和审计校验值是一致的。