业务过程中,遇到了身份证判断是否有效的问题。如能连接公安系统进行身份证判断,自然是最准确的,但是这对普通码农来讲是不现实的。

现根据大陆身份证号码规律,自己写判断规则,利用正则表达式来判断给定的字符串是否是近似一个有效的身份证号码。并将代码封装为一个Mysql函数,方便代码复用。

注意:本代码所用规则根据一代、二代身份证的数字规律进行建立,只能近似保证号码判断的准确性、排除大多数录入数据不规则的的情况,但针对少数符合规则但属于无效的情况,这里无法判断。

废话少说,直接上码:

DELIMITER $$USE `analysis`$$DROP FUNCTION IF EXISTS `is_ID_card`$$CREATE DEFINER=`lws`@`%` FUNCTION `is_ID_card`(number VARCHAR(20)CHARSET utf8) RETURNS TINYINT(1)
BEGINDECLARE flag BOOL DEFAULT FALSE;IF (LENGTH(number)=18 AND number REGEXP CONCAT('^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([1][0-4])|([6][1-6])|([7][1])|([8][1-2]))', -- 1、2位'(([0][0-9])|([1][0-9])|([2][0-9])|([3][0-9])|([4][0-3])|([5][1-3])|([8][2])|([9][0]|[1]|[9]))', -- 3、4位'(([0-3][0-9])|([4][0-4])|([5][1])|([8][1-9])|([9][0-9]))', -- 5、6位'(([1]([8]|[9])[0-9])|([2]([0]|[0-1])[0-9]))[0-9](0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])[0-9]{3}([0-9]|X)') -- 后12位OR (LENGTH(number)=15 AND number REGEXP CONCAT('^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([1][0-4])|([6][1-6])|([7][1])|([8][1-2]))','(([0][0-9])|([1][0-9])|([2][0-9])|([3][0-9])|([4][0-3])|([5][1-3])|([8][2])|([9][0]|[1]|[9]))','(([0-3][0-9])|([4][0-4])|([5][1])|([8][1-9])|([9][0-9]))','(0[1-9]|[1-9][0-9])(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])[0-9]{3}')))THEN SET flag = TRUE;END IF;RETURN flag;END$$DELIMITER ;

大家把上述代码保存为一个mysql函数,然后调用该函数即可。

使用方法:

SELECT is_ID_card('这里输入需要验证的身份证号码')

这里分18位身份证号码、15位身份证号码两种情况:

  • 它们前六位一致,都是省级代码(前两位)、地市级代码(前4位)、县区级代码(前6位);
  • 出生年月日方面,18位身份证是形如1990XXXX的格式,而15位身份证是形如79XXXX的格式,也即后者省去了年份的前两位;
  • 18位身份证最后一位是校验码,可为数字或者X,而15位身份证没有最后一位校验码。

值的注意的是,代码中的正则表达式字符串由于过长,这里使用了一个小窍门来进行换行显示,以提高代码可读性:

先把原来的一个长正则表达式拆分为几个,再使用concat()函数连接起来,因为concat()函数内部参数之间是可以任意换行的,所以就变相实现了原字符串的换行。这一点,在以后遇到字符串需要换行的时候可以使用。


========================= 2019-06-26更新分割线==============================

鉴于上述函数不能覆盖全部情况,导致部分身份证判别错误,现在重新编写了一个进阶版,此版本需要额外的新政划分表,可点此下载:

(链接: https://pan.baidu.com/s/1iRx3JzULEJKBd6QX2tnL5w 提取码: 6ynv 复制这段内容后打开百度网盘手机App,操作更方便哦)。

先上函数代码:

DELIMITER $$USE `analysis`$$DROP FUNCTION IF EXISTS `is_ID_card`$$CREATE FUNCTION `is_ID_card`(number VARCHAR(20)CHARSET utf8) RETURNS TINYINT(1)
BEGINDECLARE flag BOOL DEFAULT FALSE;IF (LENGTH(number)=18 AND SUBSTR(number,1,6) IN (SELECT b.district_id FROM administrative_division_code b WHERE b.flag=1)AND number REGEXP CONCAT('^[1-9][0-9]{5}','(([1]([8]|[9])[0-9])|([2]([0]|[0-1])[0-9]))[0-9](0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])[0-9]{3}([0-9]|X)') -- 后12位OR (LENGTH(number)=15 AND SUBSTR(number,1,6) IN (SELECT b.district_id FROM administrative_division_code b WHERE b.flag=1)AND number REGEXP CONCAT('^[1-9][0-9]{5}','(0[1-9]|[1-9][0-9])(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])[0-9]{3}')))THEN SET flag = TRUE;END IF;RETURN flag;END$$DELIMITER ;

注意:上述函数需要使用表—— administrative_division_code ,下载后,放在你自己的数据库中即可。

先上=  原创文章,如需转载请注明出处,谢谢合作!

Mysql自定义函数:身份证号码的真实性判定相关推荐

  1. hive自定义函数-身份证号合法性判断

    hive自定义函数-身份证号合法性判断 简要 代码 简要 身份证号合法性判断: 若为18位身份证号: 1.第18位数字,应该在身份证号最后一位校验位数字中 2.前17为数字分别乘以对应的加权因子,累加 ...

  2. mysql自定义函数应用_mysql functions实例:在自定义函数中应用字符串函数

    分享一段mysql自定义函数的代码,在其中用到了mysql的字符串函数length. 代码: mysql> delimiter $$ mysql> CREATE FUNCTION myFu ...

  3. 数据库系列之mysql 自定义函数function,函数和存储过程的区别

    mysql 自定义函数function,函数和存储过程的区别 https://blog.csdn.net/u010365819/article/details/80470448 https://blo ...

  4. mysql 自定义函数function,函数和存储过程的区别

    From: https://blog.csdn.net/u010365819/article/details/80470448 1.MySQL自定义函数简介 在MySQL中使用自定义函数也需要相应的要 ...

  5. mysql 自定义函数教程_MySQL自定义函数

    MySQL自定义函数 函数与存储过程类似,也是一组预先编译好的SQL语句的集合,但是存储过程可以有0个或多个返回,函数就只能有一个返回 创建函数 #语法 参数列表包含两部分 参数名和参数类型 #函数体 ...

  6. MySQL自定义函数(四十六)

    MySQL自定义函数 一.什么是MYSQL自定义函数? mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同. 二.自定义函数应该具备哪些条件? 我 ...

  7. mysql 自定义函数教程_Mysql 自定义函数

    Mysql 自定义函数怎么用 CREATE FUNCTION `strip_tags`($str text) RETURNS text BEGIN DECLARE $start, $end INT D ...

  8. MySQL自定义函数创建与使用总结

    MySQL自定义函数创建与使用总结 MySQL自定义函数和存储过程类似,也需要在数据库中创建并保存.它与存储过程一样,都是由SQL语句和控制语句组成的代码片段,可以被应用程序和其他SQL语句调用. M ...

  9. mysql自定义函数示例代码,以及属性介绍

    以下是一个MySQL自定义函数的示例代码,该函数实现了将指定字符串中的大写字母转换为小写字母的功能: DELIMITER $$ CREATE FUNCTION to_lower(str VARCHAR ...

最新文章

  1. Ubuntu16.04如何彻底删除Apache2
  2. linux c 获取进程 cpu占用率 内存占用情况
  3. 2008r2添加没有应用程序服务器,将应用程序移动到服务器2008R2 64位时的AccessViolationException...
  4. Arduino总结一
  5. 题目1005:Graduate Admission(结构体排序)
  6. 混合高斯模型_高斯混合模型(GMM)
  7. css两栏式布局示例
  8. SpringCloud项目接入华为云Paas平台CES一些注意事项
  9. HDU2136 Largest prime factor
  10. 企业上市上市央企大面积亏损折射出啥弊端?
  11. 如何让ul的符号隐藏_如何对文件进行加密?分享一下我对文件进行加密的方法(菜鸟级)...
  12. Ubuntu 16.04 安装VSCode
  13. 联想电脑BIOS失败教程
  14. 一招解决origin8 licience过期
  15. I2S时序及音频驱动
  16. 深度势能 deep potential
  17. RGB、HSV和Lab颜色空间
  18. 前端要失业了么,sketch-code让草图秒变HTML
  19. S3C2440的中断体系结构
  20. 小白从零开始搭建阿里云服务器

热门文章

  1. 快应用的用法和常见问题解答(下)
  2. Gerrit添加Verified
  3. 固定资产管理条码系统是什么
  4. python画统计图
  5. 宝付国际跨境知识小课堂 | 人民币外汇市场是个啥?
  6. ERROR: node with name rabbit already running on xxx
  7. 笔记本计算机内部部件图片,笔记本内部硬件构造图
  8. [RHEL 4U4] 最小安装后安装Apache(RPM)
  9. 第七章、Groovy面向对象
  10. CentOS6.5安装readline时报错:/usr/bin/ld : cannot find -lncurses