实现功能:

从表idcard中读取身份证号,将身份证信息和校验结果写入到表idcard_result中。

代码流程:

1. 创建存储方法validate_idcard(p_idcard),校验身份证号p_idcard是否合法

2. 创建存储过程validateIdcard从idcard表中读取身份证数据,调用存储方法validate_idcard校验合法性,将结果写入到表idcard_result

3. 调用存储过程,完成校验

set global log_bin_trust_function_creators=1;DELIMITER $$/************************************************************
函数名称:validate_idcard
参数:p_idcard
返回值:身份证校验结果备注:目前中国的身份证号码有18位和15位.
1,18位身份证号码的组成:6位地区编码+8位出生年月日+3位编号(奇男偶女)+1位校验码
2,15位身份证号码的组成:6位地区编码+6位出生年月日+3位编号(奇男偶女)18位身份证校验规则:
1、身份证号码前17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2 ;
2、将这17位数字和系数相乘的结果相加;用加出来和除以11,看余数是多少;
3、余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字。其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2;
*************************************************************/
CREATE FUNCTION `validate_idcard`(`p_idcard` varchar(18)) RETURNS varchar(255) CHARSET utf8
BEGINDECLARE v_regstr VARCHAR ( 2000 );#正则DECLARE v_sum INT (11);#求和DECLARE v_mod INT (11);#求余DECLARE v_checkcode CHAR (11) DEFAULT '10X98765432';#校验码表DECLARE v_checkbit CHAR (1);#校验码#区域代码,验证身份证号是否在所在区域DECLARE v_areacode VARCHAR (2000) DEFAULT '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';DECLARE v_idcard17 VARCHAR(20);#17位身份证号#身份证前17位每位加权因子{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};#判断身份证号是否为空IF p_idcard is null or ltrim(rtrim(p_idcard))='' THEN RETURN '身份证号为空';END IF;CASE LENGTH (p_idcard)#15位身份证只校验区域代码和出生日期WHEN 15 THENIF INSTR(v_areacode,substr(p_idcard,1,2)) = 0 THEN RETURN "区域代码错误";END IF;IF(SUBSTR(p_idcard,7,4))%4 = 0 and (SUBSTR(p_idcard,7,4))%100 <> 0 THEN  #判断是否为闰年set v_regstr := '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$';ELSE set v_regstr := '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$';IF (p_idcard REGEXP v_regstr = 1 ) THEN RETURN "身份证号正确";ELSE return "身份证号错误";END IF;END IF;return "身份证号错误";WHEN 18 THENIF INSTR(v_areacode,substr(p_idcard,1,2)) = 0 THENRETURN "区域代码错误";END IF;IF(SUBSTR(p_idcard,7,4))%4 = 0 and (SUBSTR(p_idcard,7,4))%100 <> 0 THEN set v_regstr := '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';ELSE set v_regstr := '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';END IF;#校验IF (`p_idcard` REGEXP v_regstr = 1 ) THENset v_sum:= ((SUBSTR(p_idcard,1,1)+SUBSTR(p_idcard,11,1)))*7+(SUBSTR(p_idcard,2,1)+SUBSTR(p_idcard,12,1))*9+(SUBSTR(p_idcard,3,1)+SUBSTR(p_idcard,13,1))*10+(SUBSTR(p_idcard,4,1)+SUBSTR(p_idcard,14,1))*5+(SUBSTR(p_idcard,5,1)+SUBSTR(p_idcard,15,1))*8+(SUBSTR(p_idcard,6,1)+SUBSTR(p_idcard,16,1))*4+(SUBSTR(p_idcard,7,1)+SUBSTR(p_idcard,17,1))*2+(SUBSTR(p_idcard,8,1))*1+(SUBSTR(p_idcard,9,1))*6+(SUBSTR(p_idcard,10,1))*3;set v_mod := v_sum%11;set v_checkbit := SUBSTR(v_checkcode, v_mod + 1,1);IF v_checkbit = upper(substr( p_idcard, 18, 1 ) ) THENRETURN "身份证号正确";ELSE RETURN "身份证号错误";END IF;END IF;return "身份证号错误";ELSE RETURN '身份证号位数错误';END CASE;
END$$#存储过程,用来调用存储函数,获得结果
DELIMITER $$
CREATE procedure validateIdcard()
BEGINDECLARE id int(11);DECLARE id_card varchar(18);declare result varchar(100);DECLARE has_data int DEFAULT 1;DECLARE card_result cursor for select * from idcard;DECLARE exit handler for not found set has_data=0;open card_result;repeatfetch card_result into id, id_card;select validate_idcard(id_card) into result;insert into idcard_result VALUES (id,id_card,result);until has_data = 0end repeat;close card_result;
END$$#调用存储过程
call validateIdcard();

存储过程——身份证校验相关推荐

  1. 身份证校验程序(上)- 零基础入门学习Delphi48

    身份证校验程序 让编程改变世界 Change the world by program   [caption id="attachment_2699" align="al ...

  2. ES01 数据类型、正则表达式、身份证校验

    1 基本数据类型 参见W3C的教程即可 2 正则表达式 参考博文:点击前往 3 身份证校验 参考博文:点击前往 <div class="panel panel-primary" ...

  3. sql判断邮箱是否合法_分享一个oracle身份证校验函数,判断你的身份证是否合法...

    概述 有个朋友说能不能用函数来实现对身份证的校验,所以这里用Oracle的函数来实现,其他数据库异曲同工.. 身份证校验函数 CREATE OR REPLACE FUNCTION Func_check ...

  4. 【补充一则】身份证校验的c#代码

    关于身份证号码的校验,网上的各种代码实在太多了.这里我补充一则C#的代码. 在网页上,通常是一个textbox让用户输入,然后用一个正则表达式验证控件,用这样一个正则表达式:\d{17}[\d|X]| ...

  5. JAVA 身份证校验与统一社会信用代码校验

    B话少说,上代码 原理默认大家都懂了,不懂的话可以百度一下 package com.microlinktech.rns.util;import lombok.Getter; import lombok ...

  6. 日期,手机号码正则表达式校验,身份证校验等常用工具

    日期类工具 DataUtil public class DateUtils {/*** 北京时区*/public static final ZoneOffset BJ_ZONE = ZoneOffse ...

  7. [iOS]阿里云人脸身份证校验

    之前使用人脸身份证校验时,一直返回code=-1提示"照片质量太低".当时以为是图片太小不清晰,传大一些的图片时又提示"图片过大",那时弄得很懵因为安卓端能正常 ...

  8. vue 身份证校验、识别性别/生日/年龄

    vue 身份证格式校验_chen_ai_tao的博客-CSDN博客_vue 身份证校验 Vue中根据输入的身份证号识别年龄.性别_cx&lavender的博客-CSDN博客_vue中根据省份证 ...

  9. 公民身份证校验规则最新最全最严格(包含最后一位校验码校验)

    公民身份证校验规则最新最全最严格(包含最后一位校验码校验) 身份证号前两位为省级行政区划 11: "北京", 12: "天津" 13: "河北&quo ...

  10. 最全的身份证校验规则

    function testid(id) {// 1 "验证通过!", 0 //校验不通过 // id为身份证号码var format = /^(([1][1-5])|([2][1- ...

最新文章

  1. HDU2196[树形dp+二次扫描]java和c++版本题解
  2. Shell命令-管理与性能监视之strace、ltrace
  3. linux杀java线程,如何在Linux下找出大量占用CPU的java线程
  4. hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集
  5. struts 权限控制
  6. HBuilder 打包流程
  7. Year-End Review
  8. 理解并行和并发的区别?
  9. 如何部署Windows Server 2016 中的Storage Spaces Direct超聚合解决方案
  10. tomcat的comet事件解释
  11. 滤波ad毛刺 c语言算法,Σ-Δ型ADC AD7124和AD717x的后置/增强型滤波器
  12. 2017会考计算机知识点,【高考备考】2017高二化学会考知识点汇总高中化学会考知识点...
  13. spring-data-elasticsearch 引入es版本适配
  14. 嵌入式驱动开发遇到version magic不匹配解决办法
  15. Linux常用命令分享
  16. 工作经验分享|你在工作中应该注意什么?
  17. Macbook安装pkg
  18. 基于Python的SAP流程自动化
  19. 乐观中谨慎 招聘调薪现贫富差距
  20. classloder

热门文章

  1. 一加5t Android 第三方系统上BL锁
  2. 建模软件MAYA最详细的教程介绍来了
  3. 界面自动化测试工具-Ksend
  4. mysql索引的子部分_Mysql索引数据结构详解及性能调优
  5. Adobe Photoshop简介
  6. 关于校园流浪猫狗的调查报告 新生研讨课校内调查
  7. 你需要了解的JS框架
  8. 2022 第三届字节跳动青训营,后端专场,课程报名,笔记 纲要
  9. 数字传感器:新兴的应用
  10. Lambda表达式的省略