dropfunction
ifexists
f_base_check_id_number ;
create
function `f_base_check_id_number`(number
varchar(18)charset utf8) returns
int/*
-- 原理:第一代身份證十五位數公升為第二代身份證十八位數的一般規則是:第一步,在原十五位數身份證的第六位數後面插入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)<>
18and length(number)<>
15then
---1 代表身份證號長度不是15位,也不是18位
return-1
;endif;
--2、前6位判斷
select
count(*) into v_area_result from t_dm_region where `code`=
substring(number,1,6
);if v_area_result<>
1then
---2 代表地區碼錯誤
return-2
;endif;
--3、如果是18位判斷是不是都是數字,如果不都是數字,那前17位是不是數字。
if length(number)=
18then
select
substring(number,1,17) into
v_17;
endif
;if length(number)=
15then
select concat(substring(number,1,6),'
19',substring(number,7,15)) into
v_17;
endif;--
判斷前面n-1位是不是數字
select v_17 regexp '
[^0-9.]
'into
v_temp;
if v_temp=
1then
return-3
;
endif;--
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;
ifnot (v_year>=
1900
and v_year<=date_format(now(), '
%y')) then
---4代表是出生年份錯誤
return-4
;endif;
ifnot (v_month>=
1and v_month<=
12) then
---5代表是出生月份錯誤
return-5
;endif;
ifnot (v_date>=
1and v_date<=
31) then
---6代表是出生日期錯誤
return-6
;endif;
--判斷是不是閏年的日期
select date_format(substring(number,7,8), '
%y-%m-%d
') into
v_checkdate;
if ifnull(v_checkdate,-
7)=-
7then
return-7
;endif;
--5、判斷是不是符合校驗碼規則
--對於前17位,都要遍歷一次計算出乘以係數的和
while v_i<=
17do
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;
endwhile
;
--餘數
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)=
18then
ifupper(substring(number,18,1))=v_last_jiaoyanma then
return1;
else
return-8
;
endif
;endif;
return
1;
end
身份證號驗證
原文 身份證號驗證 public static boolean isidnumber string idnumber 定義判別使用者身份證號的正規表示式 15位或者18位,最後一位可以為字母 string regularexpression 1 9 d 18 19 20 d 0 1 9 10 11 ...
身份證號驗證
身份證號組成 17位數字 1位校驗碼 位址碼 前六位 出生日期碼 第七位至第十位 順序碼 第十五位至十七位 對同年同月同日生的人便定的順序號,順序號奇數為男生,偶數為女生 檢驗碼 第十八位 0 9 x var acity function iscarid sid d x i.test sid ret...
身份證號的檢測
ddddddyyyymmddxxsp共18位 公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為 六位數字位址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。2 位址碼 表示編碼物件常住戶口所在縣 市 旗 區 的行政區劃 按gb t2260的規定執行。3 出...