首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

身份证校验,稽查身份证号码输入是否正确

2014-01-08 
身份证校验,检查身份证号码输入是否正确?文档出处:http://netkiller.github.iohttp://netkiller.sourcefor

身份证校验,检查身份证号码输入是否正确

?

身份证校验,稽查身份证号码输入是否正确文档出处:http://netkiller.github.iohttp://netkiller.sourceforge.net

Netkiller Architect 手札Netkiller Developer 手札Netkiller PHP 手札Netkiller Python 手札Netkiller Testing 手札Netkiller Cryptography 手札Netkiller Linux 手札Netkiller CentOS 手札Netkiller FreeBSD 手札Netkiller Security 手札Netkiller Version 手札Netkiller Web 手札Netkiller Monitoring 手札Netkiller Storage 手札Netkiller Mail 手札Netkiller Shell 手札Netkiller Network 手札Netkiller Database 手札Netkiller PostgreSQL 手札Netkiller MySQL 手札Netkiller NoSQL 手札Netkiller LDAP 手札Netkiller Cisco IOS 手札Netkiller H3C 手札Netkiller Multimedia 手札Netkiller Docbook 手札Netkiller 开源软件 手札???

?

4.17.?数据检查

4.17.1.?身份证校验

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

CREATE DEFINER=`neo`@`%` FUNCTION `check_id_number`(`idnumber` CHAR(18))RETURNS enum('true','false')LANGUAGE SQLNOT DETERMINISTICNO SQLSQL SECURITY DEFINERCOMMENT ''BEGINDECLARE status ENUM('true','false') default 'false';DECLARE verify CHAR(1);DECLARE sigma INT;DECLARE remainder INT;IF length(idnumber) = 18 THENset 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 remainderwhen 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 THENset 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)

?

1 楼 leonayx123 2013-12-31   被这么长的function吓尿了。又是substr 又是cast的。为什么不放在代码里做呢?
2 楼 yixiandave 2013-12-31   这个函数没必要放数据库里吧,放在代码中不是更方便重用吗,而且也更简单 3 楼 netkiller.github.com 2013-12-31   yixiandave 写道这个函数没必要放数据库里吧,放在代码中不是更方便重用吗,而且也更简单

不放在数据中怎么 commit/rollback 还有触发器强制检查? 4 楼 netkiller.github.com 2013-12-31   leonayx123 写道被这么长的function吓尿了。又是substr 又是cast的。为什么不放在代码里做呢?


数据库进程间通信解决方案之MQ
http://netkiller.github.io/journal/mysql.plugin.mq.html
Mr. Neo Chen (netkiller), 陈景峰(BG7NYT)


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

$Id: mysql-plugin.xml 587 2013-12-16 14:00:00Z netkiller $

版权 ? 2011, 2012, 2013, 2014 http://netkiller.github.io

$Date: 2013-12-16 13:34:20 +0800 (Thu, 16 May 2013) $

摘要

你是否想过当数据库中的数据发生变化的时候出发某种操作?但因数据无法与其他进程通信(传递信号)让你放弃,而改用每隔一段时间查询一次数据变化的方法?下面的插件可以解决你的问题。

原文出处:http://netkiller.github.io/journal/mysql.plugin.fifo.html

我的系列文档

Netkiller Architect 手札 Netkiller Developer 手札 Netkiller PHP 手札 Netkiller Python 手札 Netkiller Testing 手札 Netkiller Cryptography 手札
Netkiller Linux 手札 Netkiller CentOS 手札 Netkiller FreeBSD 手札 Netkiller Security 手札 Netkiller Version 手札 Netkiller Web 手札
Netkiller Monitoring 手札 Netkiller Storage 手札 Netkiller Mail 手札 Netkiller Shell 手札 Netkiller Network 手札 Netkiller Database 手札
Netkiller PostgreSQL 手札 Netkiller MySQL 手札 Netkiller NoSQL 手札 Netkiller LDAP 手札 Netkiller Cisco IOS 手札 Netkiller H3C 手札
Netkiller Multimedia 手札 Netkiller Docbook 手札 Netkiller 开源软件 手札

目录

1. 背景
2. 应用场景
3. Mysql plugin
4. plugin 的开发与使用
5. 插件如何使用

1. 背景

之前我发表过一篇文章 http://netkiller.github.io/journal/mysql.plugin.fifo.html

该文章中提出了通过fifo 管道,实现数据库与其他进程的通信。属于 IPC 机制(同一个OS/服务器内),后我有采用ZeroMQ重新实现了一个 RPC 机制的方案,同时兼容IPC(跨越OS/服务器)

各种缩写的全称 IPC(IPC :Inter-Process Communication 进程间通信),ITC(ITC : Inter Thread Communication 线程间通信)与RPC(RPC: Remote Procedure Calls远程过程调用)。

支持协议

inproc://my_publisher
tcp://server001:5555
ipc:///tmp/feeds/0


2. 应用场景

如果你像处理数据,由于各种原因你不能在程序中实现,你可以使用这个插件。当数据库中的数据发生变化的时候出发某种操作,你可以使用这个插件。

有时候你的项目可能是外包的,项目结束后外包方不会在管你,你有无法改动现有代码,或者根本不敢改。你可以使用这个插件

采用MQ技术对数据库无任何压力,与采用程序处理并无不同,省却了写代码

处理方法,可以采用同步或者异步方式

例 1. 发送短信

发送短信、邮件,只需要查询出相应手机号码,发送到MQ的服务端,服务端接收到手机号码后,放入队列中,多线程程序从队列中领取任务,发送短信。

select zmq_client('tcp://localhost:5555',mobile) from demo where subscribed='Y' ...;


传递多个参数,可以使用符号分隔

select zmq_client('tcp://localhost:5555',concat(name,',',mobile,', news')) from demo;
select zmq_client('tcp://localhost:5555',concat(name,'|',mobile,'|news')) from demo;


json格式

select zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,', template:news}')) from demo;


建议采用异步方式,MQ端接收到任务立即反馈 “成功”信息,因为我们不太关心是否能发送成功,本身就是盲目性的发送,手机号码是否可用我们无从得知,短信或者邮件的发送到达率不是100%,所以当进入队列后,让程序自行处理,将成功或者失败信息记录到日志中即可。

例 2. 处理图片

首先查询出需要处理图片,然后将路径与分辨率传递给MQ另一端的处理程序

select zmq_client('tcp://localhost:5555',concat(image,',800x600}')) from demo;


建议采用异步方式,MQ端接收到任务立即反馈 “成功”信息

例 3. 身份证号码校验

select zmq_client('tcp://localhost:5555',id_number) from demo;


可以采用同步方案,因为MQ款处理几乎不会延迟,直接将处理结构反馈

例 4. 静态化案例

情景模拟,你的项目是你个电商项目,采用外包模式开发,项目已经开发完成。外包放不再负责维护,你现在要做静态化。增加该功能,你要检查多处与商品表相关的造作。

于其改代码,不如程序从外部处理,这样更保险。我们只要写一个程序将动态 URL 下载保存成静态即可,当数据发生变化的时候重新下载覆盖即可

CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_insert` AFTER INSERT ON `demo` FOR EACH ROW BEGIN
select zmq_client('tcp://localhost:5555', NEW.id);
END
CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_update` AFTER UPDATE ON `demo` FOR EACH ROW BEGIN
select zmq_client('tcp://localhost:5555', NEW.id);
END
CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_delete` AFTER DELETE ON `demo` FOR EACH ROW BEGIN
select zmq_client('tcp://localhost:5555', NEW.id);
END


MQ 另一端的服务会下载http://www.example.com/goods.php?cid=111&id=100, 然后生成html页面,http://www.example.com/111/100.html

插入会新建页面,更新会覆盖页面,删除会删除页面

这样无论商品的价格,属性改变,静态化程序都会做出相应的处理。

例 5. 数据同步案例

我们有多个数据库,A 库里面的数据发生变化后,要同步书库到B库,或者处理结果,或者数据转换后写入其他数据库中

方法也是采用触发器或者EVENT处理

3. Mysql plugin

我开发了几个 UDF, 共4个 function

UDF

zmq_client(sockt,message)

    sockt .成功返回true,失败返回flase.

有了上面的function后你就可以在begin,commit,rollback 直接穿插使用,实现在事物处理期间做你爱做的事。也可以用在触发器与EVENT定时任务中。
4. plugin 的开发与使用

编译UDF你需要安装下面的软件包

sudo apt-get install pkg-config
sudo apt-get install libmysqlclient-dev

sudo apt-get install gcc gcc-c++ make cmake


https://github.com/netkiller/mysql-zmq-plugin

编译udf,最后将so文件复制到 /usr/lib/mysql/plugin/


git clone https://github.com/netkiller/mysql-zmq-plugin.git
cd mysql-zmq-plugin

cmake .
make && make install



装载

create function zmq_client returns string soname 'libzeromq.so';
create function zmq_publish returns string soname 'libzeromq.so';


卸载

drop function zmq_client;
drop function zmq_publish;


确认安装成功


mysql> SELECT * FROM `mysql`.`func` where name like 'zmq%';
+-------------+-----+--------------+----------+
| name        | ret | dl           | type     |
+-------------+-----+--------------+----------+
| zmq_client  |   0 | libzeromq.so | function |
| zmq_publish |   0 | libzeromq.so | function |
+-------------+-----+--------------+----------+
2 rows in set (0.00 sec)



5. 插件如何使用

插件有很多种用法,这里仅仅一个例

编译zeromq server 测试程序

cd test
cmake .
make


启动服务进程

./server


发送Hello world!


mysql> select zmq_client('tcp://localhost:5555','Hello world!');
+---------------------------------------------------+
| zmq_client('tcp://localhost:5555','Hello world!') |
+---------------------------------------------------+
| Hello world! OK                                   |
+---------------------------------------------------+
1 row in set (0.01 sec)



查看服务器端是否接收到信息。

$ ./server
Received: Hello world!


我们再将上面的例子使用触发器进一步优化


mysql> select zmq_client('tcp://localhost:5555',mobile) from demo;
+-------------------------------------------+
| zmq_client('tcp://localhost:5555',mobile) |
+-------------------------------------------+
| 13113668891 OK                            |
| 13113668892 OK                            |
| 13113668893 OK                            |
| 13322993040 OK                            |
| 13588997745 OK                            |
+-------------------------------------------+
5 rows in set (0.03 sec)



服务器端已经接收到数据库发过来的信息

$ ./server
Received: Hello world!
Received: 13113668891
Received: 13113668892
Received: 13113668893
Received: 13322993040
Received: 13588997745


我们可以拼装json或者序列化数据,发送给远端


mysql> select zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,'}')) from demo;
+------------------------------------------------------------------------------+
| zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,'}')) |
+------------------------------------------------------------------------------+
| {name:neo, tel:13113668891} OK                                               |
| {name:jam, tel:13113668892} OK                                               |
| {name:leo, tel:13113668893} OK                                               |
| {name:jerry, tel:13322993040} OK                                             |
| {name:tom, tel:13588997745} OK                                               |
+------------------------------------------------------------------------------+
5 rows in set (0.03 sec)



返回数据取决于你服务端怎么编写处理程序,你可以返回true/false等等。

触发器以及事务处理,这里就不演示了
5 楼 leonayx123 2013-12-31   你的插件就是在验证一个身份证字符串,或者图片地址字符串的格式吗?
mysql的函数中能不能调用正则表达式式来简化代码呢? 6 楼 netkiller.github.com 2013-12-31   leonayx123 写道你的插件就是在验证一个身份证字符串,或者图片地址字符串的格式吗?
mysql的函数中能不能调用正则表达式式来简化代码呢?

我那个插件是消息队列访问

2. 应用场景

如果你像处理数据,由于各种原因你不能在程序中实现,你可以使用这个插件。当数据库中的数据发生变化的时候出发某种操作,你可以使用这个插件。

有时候你的项目可能是外包的,项目结束后外包方不会在管你,你有无法改动现有代码,或者根本不敢改。你可以使用这个插件

采用MQ技术对数据库无任何压力,与采用程序处理并无不同,省却了写代码

处理方法,可以采用同步或者异步方式

例 1. 发送短信

发送短信、邮件,只需要查询出相应手机号码,发送到MQ的服务端,服务端接收到手机号码后,放入队列中,多线程程序从队列中领取任务,发送短信。

select zmq_client('tcp://localhost:5555',mobile) from demo where subscribed='Y' ...;


传递多个参数,可以使用符号分隔

select zmq_client('tcp://localhost:5555',concat(name,',',mobile,', news')) from demo;
select zmq_client('tcp://localhost:5555',concat(name,'|',mobile,'|news')) from demo;


json格式

select zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,', template:news}')) from demo;


建议采用异步方式,MQ端接收到任务立即反馈 “成功”信息,因为我们不太关心是否能发送成功,本身就是盲目性的发送,手机号码是否可用我们无从得知,短信或者邮件的发送到达率不是100%,所以当进入队列后,让程序自行处理,将成功或者失败信息记录到日志中即可。

例 2. 处理图片

首先查询出需要处理图片,然后将路径与分辨率传递给MQ另一端的处理程序

select zmq_client('tcp://localhost:5555',concat(image,',800x600}')) from demo;


建议采用异步方式,MQ端接收到任务立即反馈 “成功”信息

例 3. 身份证号码校验

select zmq_client('tcp://localhost:5555',id_number) from demo;


可以采用同步方案,因为MQ款处理几乎不会延迟,直接将处理结构反馈

例 4. 静态化案例

情景模拟,你的项目是你个电商项目,采用外包模式开发,项目已经开发完成。外包放不再负责维护,你现在要做静态化。增加该功能,你要检查多处与商品表相关的造作。

于其改代码,不如程序从外部处理,这样更保险。我们只要写一个程序将动态 URL 下载保存成静态即可,当数据发生变化的时候重新下载覆盖即可

CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_insert` AFTER INSERT ON `demo` FOR EACH ROW BEGIN
select zmq_client('tcp://localhost:5555', NEW.id);
END
CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_update` AFTER UPDATE ON `demo` FOR EACH ROW BEGIN
select zmq_client('tcp://localhost:5555', NEW.id);
END
CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_delete` AFTER DELETE ON `demo` FOR EACH ROW BEGIN
select zmq_client('tcp://localhost:5555', NEW.id);
END


MQ 另一端的服务会下载http://www.example.com/goods.php?cid=111&id=100, 然后生成html页面,http://www.example.com/111/100.html

插入会新建页面,更新会覆盖页面,删除会删除页面

这样无论商品的价格,属性改变,静态化程序都会做出相应的处理。

例 5. 数据同步案例

我们有多个数据库,A 库里面的数据发生变化后,要同步书库到B库,或者处理结果,或者数据转换后写入其他数据库中

方法也是采用触发器或者EVENT处理

热点排行