信息来源:

https://blog.raymondwu.net/2018/05/11/%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%95%B0%E6%8D%AE%E5%BA%93/

drop function if EXISTS f_base_check_id_number ;create function `f_base_check_id_number`(number varchar(18)charset utf8) returns int
/*
-- 作者:黄海
-- 时间:2018-08-21
-- 原理:第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入19 ,这样身份证号码即为十七位数;第二步,按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号。
--   校验码计算方法:将身份证前十七位数分别乘以不同系数,从第一至十七位的系数分别为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2,将这十七位数字和系数相乘的结果相加,用加出来的和除以11,看看余数是多少。余数只可能有0、1、2、3、4、5、6、7、8、9、10这十一个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,这样就得出了第二代身份证第十八位数的校验码。-- 测试用例
select f_base_check_id_number('511423198808200077');
*/BEGIN
-- 区域码检查结果
declare v_area_result int;
-- 出生日期年
declare v_year int;
-- 出生日期月
declare v_month int;
-- 出生日期日
declare v_date int;
-- 判断闰月
declare v_checkdate datetime;
-- 前17位
declare v_17 varchar(17);
-- 临时变量
declare v_temp int;-- 前17位的系数
declare v_17_xishu varchar(256);
-- 前17位乘以系数后的和
declare v_sum_17 int;DECLARE v_i INT ;
declare v_current_xishu int;
declare v_current_number int;
declare v_yushu int;
declare v_jiaoyanma VARCHAR(256);
declare v_last_jiaoyanma varchar(1);
set v_sum_17=0;
-- 系数
set v_17_xishu='7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2';
-- 校验码
set v_jiaoyanma='1,0,X,9,8,7,6,5,4,3,2';
set v_i=1;-- 1、判断是不是15位或者18位
IF LENGTH(number)<>18  and  LENGTH(number)<>15 then -- -1 代表身份证号长度不是15位,也不是18位return -1;
end if;-- 2、前6位判断
select count(*) into v_area_result from t_dm_region where `code`=substring(number,1,6);
if v_area_result<>1 then -- -2 代表地区码错误return -2;
end if;-- 3、如果是18位判断是不是都是数字,如果不都是数字,那前17位是不是数字。
IF LENGTH(number)=18 then SELECT substring(number,1,17) into  v_17;
end if ;IF LENGTH(number)=15 then SELECT CONCAT(substring(number,1,6),'19',substring(number,7,15)) into  v_17;
end if ;-- 判断前面N-1位是不是数字
select v_17  REGEXP '[^0-9.]' into v_temp;if v_temp=1 then return -3;end if;-- 4、判断出生年月日
select substring(number,7,4) into v_year;
select substring(number,11,2) into v_month;
select substring(number,13,2) into v_date;if not (v_year>=1900 and v_year<=DATE_FORMAT(NOW(), '%Y')) then -- -4代表是出生年份错误 return -4;
end if;if not (v_month>=1 and v_month<=12) then -- -5代表是出生月份错误 return -5;
end if;if not (v_date>=1 and v_date<=31) then -- -6代表是出生日期错误 return -6;
end if;-- 判断是不是闰年的日期
SELECT DATE_FORMAT(substring(number,7,8), '%Y-%m-%d') into v_checkdate;
if ifnull(v_checkdate,-7)=-7 then return -7;
end if;-- 5、判断是不是符合校验码规则-- 对于前17位,都要遍历一次计算出乘以系数的和while v_i<=17 do      select CAST(substring(number,v_i,1) as signed) into v_current_number;        SELECT CAST(substring_index(substring_index(v_17_xishu,',', v_i), ',',-1) as signed) into v_current_xishu;                set v_sum_17=v_sum_17+v_current_number*v_current_xishu;                set v_i=v_i+1;end while;-- 余数set v_yushu=v_sum_17 mod 11;SELECT UPPER(substring_index(substring_index(v_jiaoyanma,',', v_yushu+1), ',',-1)) into     v_last_jiaoyanma;-- 如果是18位,那么最后一位的检验码是不是正确?
IF LENGTH(number)=18 then if  upper(substring(number,18,1))=v_last_jiaoyanma then return 1;elsereturn -8;end if;
end if ;return 1;
END

身份证号归属地数据库相关推荐

  1. .net函数查询_Java百宝箱——实现ip地址、手机号、身份证号归属地查询

    文章目录 1.功能界面 2.ip地址查询 3.身份证归属地查询 4.更多功能(简繁体转换.天气查询) 网上冲浪是我们每个人每天必做的运动 ,那么在冲浪时,每个人都会携带一个ip地址.电影中的黑客往往能 ...

  2. Java百宝箱——实现ip地址、手机号、身份证号归属地查询

    文章目录 1.功能界面 2.ip地址查询 3.身份证归属地查询 4.更多查询 1.功能界面 package com.company;import com.alibaba.fastjson.JSONOb ...

  3. 数据库身份证号用什么类型_互联网企业数据库安全的现状与对策

    随着移动5G信息的到来,人们的生活越来越离不开网络,用户的在线行为被不断观察和记录,由此形成了海量个人数据,云计算和大数据技术也同时在飞速发展,数据化,智能化贯穿了社会生活的方方面面,互联网服务和应用 ...

  4. 数据库身份证号用什么类型_【文末送书】MySQL数据库?看这一篇干货文章就够了!...

    前言 为啥学习MySQL呢?因为MySQL是最流行的关系型数据库管理系统之一,在web应用方面,MySQL是最好的软件.MySQL所使用的sql语言是用于访问数据库的最常用标准化语言. 放心,读这期内 ...

  5. 数据库身份证号加密密码加密_使用基于密码的加密保护会议室数据库

    数据库身份证号加密密码加密 As developers we are often tasked with securing the data we store in our applications. ...

  6. 身份证号查询归属地的实际应用场景

    身份证号查询归属地是一种常见的信息安全服务.它以号段为基础,可以根据输入的身份证号来查询出归属地信息.该功能目前在很多领域中应用,在客汇宝APP上就可以利用身份证号码查询到归属地. 下面我们就来介绍下 ...

  7. 数据库身份证号加密密码加密_使用密码加密数据

    数据库身份证号加密密码加密 介绍 (Introduction) When we're encrypting data, typically we will create a random key th ...

  8. Python 实现验证身份证号真假以及查询归属地、出生年月等信息

    python判断真假身份证号 识别一串身份证是否是真实的身份证号码: 公民身份号码是特征组合码,共18位,由17位数字本体码和1位数字校验码组成. 排列顺序从左至右依次为: 6位数字地址码,8位数字出 ...

  9. SQL Server数据库通过身份证号获取年龄段分布

    使用sql语句获取表中存储数据的年龄分布 该表存储数据为基本信息,包含身份证号,但没有存储年龄的字段(考虑到年龄在变化) 该SQL为了获取用户的年龄分布 SELECT SUM(CASE WHEN ag ...

  10. 数据库SQL函数 根据身份证号/出生年月 精确计算年龄(Oracle/MySQL)

    <问题> 根据身份证号统计年龄(18位) Oracle <思路> (1)Substr()函数在Oracle使用中表示被劫取的字符串表达式,截取字符串的内容. (2)To_dat ...

最新文章

  1. 05 Java程序员面试宝典视频课程之Jquery
  2. 基于java的InputStream.read(byte[] b,int off,int len)算法学习!
  3. Ubuntu x64安装Android studio 全部步骤和问题解决
  4. thinkphp的分页类
  5. qt creator 设置按键颜色_Qt编写自定义控件30-颜色多态按钮
  6. layUI table 按条件搜索 结果整个页面刷新
  7. 怎么多快好省地学习中文自然语言处理
  8. 教之初考试系统登录选择服务器,教之初考试系统使用图解
  9. MATLAB 多元多项式的除法
  10. C专家编程第二章,c语言特性的不足
  11. AMD HD7850 4G显卡刷Bios验真伪
  12. 向日葵无法远程控制打开文件软件界面显示
  13. windows 系统arp命令
  14. 图书速读 | 一分钟读完《斯坦福高效睡眠法》
  15. Beta周王者荣耀交流协会第六次会议
  16. 用声卡实现的存储示波器
  17. python pip 安装包失败问题,下载缓慢问题
  18. 关于PKI 你了解多少
  19. python粘性拓展_拓展Python Markdown
  20. MySQL EXPLAIN ANALYZE

热门文章

  1. Python实现页面置换算法
  2. GUI界面设计1 三角函数
  3. 网络调试助手连接mysql_网络调试助手模拟MQTT协议连接百度物联网并操作时序数据库...
  4. UE4_屏幕位置与世界位置的相互转化
  5. java 调用宏_通过java代码实现调用excel当中的宏的操作。
  6. 品质qc工程图_QC工程图_(品管).xls
  7. C语言运算符和表达式题目练习
  8. C#进行注册表项和键值操作
  9. AI之DS:人工智能领域之数据科学领域六大实践场景(金融信用违约、反欺诈模型、客户偏好洞察、智能推荐、精准营销、客户流失管理)所对应的机器学习算法总结(持续更新)
  10. 深入理解SSIM(两图像结构相似度指标)(附matlab代码)