身份證號歸屬地資料庫

2022-02-07 16:32:42 字數 4113 閱讀 1301

drop

function

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 出...