> 데이터 베이스 > MySQL 튜토리얼 > 通过SQL校验身份证号码是否正确

通过SQL校验身份证号码是否正确

PHPz
풀어 주다: 2019-02-22 16:42:15
원래의
10767명이 탐색했습니다.

根据提供的身份证号码信息验证身份证号码是否符合二代身份证规范,其中区域编码网上可下载。

使用数据库为DB2,但目测可以通用身份证号码第18位验证算法从网上查得,具体验证算法如下:
1、将前面的身份证号码17位数分别乘以不同的系数。第i位对应的数为[2^(18-i)]mod11。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、将这17位数字和系数相乘的结果相加;
3、用加出来和除以11,看余数是多少?;
4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;             <无>         

相关mysql视频教程推荐:《mysql教程》                                      

select 
	/*pspt_id为用户身份证号码*/
	a.pspt_id 
	/*判断用户身份证是否符合规则*/
	,case 
		/*判断身份证号码是否为18位*/
		when length(a.pspt_id)<>&#39;18&#39; then &#39;身份证号码位数不对&#39; 
		/*判断身份证号码前17位是否含除数字外的字符*/
		when translate(substr(a.pspt_id,1,17),&#39;&#39;,&#39;0123456789&#39;) <>&#39;&#39; then &#39;身份证号码前17位格式不正确&#39; 
		/*判断身份证的年份是否在合理范围内*/
		when substr(a.pspt_id,7,4) not between &#39;1900&#39; and &#39;2014&#39; then &#39;身份证年份错误&#39; 
		/*判断身份证的月份是否在合理范围内*/
		when substr(a.pspt_id,11,2) not between &#39;01&#39; and &#39;12&#39; then &#39;身份证月份错误&#39; 
		/*判断身份证日期是否在合理范围内*/
		when substr(a.pspt_id,13,2) not between 1 and day(to_date(char(substr(a.pspt_id,7,4)||&#39;-&#39;||substr(a.pspt_id,11,2)||&#39;-01&#39;,10),&#39;yyyy-mm-dd&#39;)+1 month-1 day) then &#39;身份证日期错误&#39; 
		/*判断身份证号码的第18位是否符合验证规则*/
		when 
			mod(( 
				substr(a.pspt_id,1,1)*7+ 
				substr(a.pspt_id,2,1)*9+ 
				substr(a.pspt_id,3,1)*10+ 
				substr(a.pspt_id,4,1)*5+ 
				substr(a.pspt_id,5,1)*8+ 
				substr(a.pspt_id,6,1)*4+ 
				substr(a.pspt_id,7,1)*2+ 
				substr(a.pspt_id,8,1)*1+ 
				substr(a.pspt_id,9,1)*6+ 
				substr(a.pspt_id,10,1)*3+ 
				substr(a.pspt_id,11,1)*7+ 
				substr(a.pspt_id,12,1)*9+ 
				substr(a.pspt_id,13,1)*10+ 
				substr(a.pspt_id,14,1)*5+ 
				substr(a.pspt_id,15,1)*8+ 
				substr(a.pspt_id,16,1)*4+ 
				substr(a.pspt_id,17,1)*2 
			),11) 
			<> 
			( 
			case 
				when substr(a.pspt_id,18,1)=&#39;1&#39; then &#39;0&#39; 
				when substr(a.pspt_id,18,1)=&#39;0&#39; then &#39;1&#39; 
				when substr(a.pspt_id,18,1) in (&#39;X&#39;,&#39;x&#39;) then &#39;2&#39; 
				when substr(a.pspt_id,18,1)=&#39;9&#39; then &#39;3&#39; 
				when substr(a.pspt_id,18,1)=&#39;8&#39; then &#39;4&#39; 
				when substr(a.pspt_id,18,1)=&#39;7&#39; then &#39;5&#39; 
				when substr(a.pspt_id,18,1)=&#39;6&#39; then &#39;6&#39; 
				when substr(a.pspt_id,18,1)=&#39;5&#39; then &#39;7&#39; 
				when substr(a.pspt_id,18,1)=&#39;4&#39; then &#39;8&#39; 
				when substr(a.pspt_id,18,1)=&#39;3&#39; then &#39;9&#39; 
				when substr(a.pspt_id,18,1)=&#39;2&#39; then &#39;10&#39; 
			end 
			) 
		then &#39;身份证验证错误&#39; 
		/*判断身份证号码的区域编码是否符合规则*/
		when b.county_sar_code is null then &#39;区县编码校验错误&#39; 
		else &#39;有效实名制客户&#39; 
	end
/*用户信息表,包含所需要查询的身份证号码信息*/
from usr_info a 
/*身份证的行政区域编码表,从统计局官网和网上可以下载,设定county_sar_code为6位行政编码*/
left join csounty_sar b 
on substr(a.pspt_id,1,6)=b.county_sar_code
로그인 후 복사
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿