专栏首页NetkillerMySQL·身份证校验

MySQL·身份证校验

本文节选自《Netkiller Architect 手札》

4.17. 数据检查

4.17.1. 身份证校验

该函数能够检查身份证号码是否正确

CREATE DEFINER=`neo`@`%` FUNCTION `check_id_number`(`idnumber` CHAR(18))
	RETURNS enum('true','false')
	LANGUAGE SQL
	NOT DETERMINISTIC
	NO SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
DECLARE status ENUM('true','false') default 'false';
DECLARE verify CHAR(1);
DECLARE sigma INT;
DECLARE remainder INT;

IF length(idnumber) = 18 THEN
	set sigma = cast(substring(idnumber,1,1) as UNSIGNED) * 7
		+cast(substring(idnumber,2,1) as UNSIGNED) * 9
		+cast(substring(idnumber,3,1) as UNSIGNED) * 10
		+cast(substring(idnumber,4,1) as UNSIGNED) * 5
		+cast(substring(idnumber,5,1) as UNSIGNED) * 8
		+cast(substring(idnumber,6,1) as UNSIGNED) * 4
		+cast(substring(idnumber,7,1) as UNSIGNED) * 2
		+cast(substring(idnumber,8,1) as UNSIGNED) * 1
		+cast(substring(idnumber,9,1) as UNSIGNED) * 6
		+cast(substring(idnumber,10,1) as UNSIGNED) * 3
		+cast(substring(idnumber,11,1) as UNSIGNED) * 7
		+cast(substring(idnumber,12,1) as UNSIGNED) * 9
		+cast(substring(idnumber,13,1) as UNSIGNED) * 10
		+cast(substring(idnumber,14,1) as UNSIGNED) * 5
		+cast(substring(idnumber,15,1) as UNSIGNED) * 8
		+cast(substring(idnumber,16,1) as UNSIGNED) * 4
		+cast(substring(idnumber,17,1) as UNSIGNED) * 2;
	set remainder = MOD(sigma,11);
	set verify = (case remainder
		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
	);

END IF;

IF right(idnumber,1) = verify THEN
	set status = 'true';
END IF;

RETURN status;

END			

首先我们使用正确身份证号码进行测试,返回true

			mysql> select check_id_number('330702198003090915');
+---------------------------------------+
| check_id_number('330702198003090915') |
+---------------------------------------+
| true                                  |
+---------------------------------------+
1 row in set (0.01 sec)			

长度不符合18位直接返回false.

			mysql> select check_id_number('33070219800309');
+-----------------------------------+
| check_id_number('33070219800309') |
+-----------------------------------+
| false                             |
+-----------------------------------+
1 row in set (0.00 sec)	

mysql> select check_id_number('33070219800309091457889');
+--------------------------------------------+
| check_id_number('33070219800309091457889') |
+--------------------------------------------+
| false                                      |
+--------------------------------------------+
1 row in set, 1 warning (0.00 sec)			

随便改译为数,校验失败返回 false

			mysql> select check_id_number('330702198003090914');
+---------------------------------------+
| check_id_number('330702198003090914') |
+---------------------------------------+
| false                                 |
+---------------------------------------+
1 row in set (0.00 sec)					

本文分享自微信公众号 - Netkiller(netkiller-ebook),作者:景峯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 以太坊智能合约开发入门

    中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

    netkiller old
  • Nginx 反向代理可以缓存 HTTP POST 请求页面吗?

    本文节选自《Netkiller Web 手札》 作者:netkiller 网站:http://www.netkiller.cn 答案是可以! 因为nginx ...

    netkiller old
  • Linux 系统与数据库安全

    Linux 系统与数据库安全 目录 1. 帐号安全 1.1. Shell 安全 1.2. .history 文件 2. 临时文件安全 3. 其他安全问题 4. ...

    netkiller old
  • Angular中关于时间的操作总结

    nodejs上的时间和我本地的时间总是相差8个小时,这导致我每次发送时间到后台时,nodejs将时间转化成字符串传送出去的时候总是和我服务器上的时间相差8小时。...

    易兒善
  • Android基础总结(1)

    1、Android开发的特点 四大组件:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)、内容提供器(Con...

    mukekeheart
  • 如何使用LaunchRocket自动定时执行任务

    我们经常有这样的需求,发现磁盘空间快满了要去手动清一下,clone完自己star的项目后,隔一段时间会去手动pull一下代码,这样的操作虽然可行,但无形之中浪费...

    kunge
  • 【算法随记七】巧用SIMD指令实现急速的字节流按位反转算法。

      字节按位反转算法,在有些算法加密或者一些特殊的场合有着较为重要的应用,其速度也是一个非常关键的应用,比如一个byte变量a = 3,其二进制表示为00000...

    用户1138785
  • 《Monkey Android》第1课之前言

    《Monkey Java》刚刚撸完,立刻就开始撸《Monkey Android》系列了。

    GitOPEN
  • 结合 huginn 实现自动推送猫眼电影上线提醒

    关于 huginn 的介绍, 网上已经存在很多了, 简单来说, 就是一个私有化的 IFTTT. 可以在上面定制各种事件触发. 本文以通过 huginn 收集猫眼...

    huginn 中文网

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动