|
18位身份證校驗位的計算方法
18位身份證標準在國家質(zhì)量技術監(jiān)督局于1999年7月1日實施的GB11643-1999《公民身份號碼》中做了明確的規(guī)定。
GB11643-1999《公民身份號碼》為GB11643-1989《社會保障號碼》的修訂版,其中指出將原標準名稱“社會保障號碼”更名為“公民身份號碼”,另外GB11643-1999《公民身份號碼》從實
施之日起代替GB11643-1989。
GB11643-1999《公民身份號碼》主要內(nèi)容如下:
一、范圍
該標準規(guī)定了公民身份號碼的編碼對象、號碼的結(jié)構(gòu)和表現(xiàn)形式,使每個編碼對象獲得一個唯一的、不變的法定號碼。
二、編碼對象
公民身份號碼的編碼對象是具有中華人民共和國國籍的公民。
三、號碼的結(jié)構(gòu)和表示形式
1、號碼的結(jié)構(gòu)
公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗碼。
2、地址碼
表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。
3、出生日期碼
表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。
4、順序碼
表示在同一地址碼所標識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
5、校驗碼
(1)十七位數(shù)字本體碼加權(quán)求和公式
S = Ai * Wi, i = 2, ... , 18
Y = mod(S, 11)
i: 表示號碼字符從右至左包括校驗碼字符在內(nèi)的位置序號
Ai:表示第i位置上的身份證號碼字符值
Wi:表示第i位置上的加權(quán)因子
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
(2)校驗碼字符值的計算
Y: 0 1 2 3 4 5 6 7 8 9 10
校驗碼: 1 0 X 9 8 7 6 5 4 3 2
四、舉例如下:
北京市朝陽區(qū): 11010519491231002X
廣東省汕頭市: 440524188001010014
--驗證15位 及18位 身份證號碼的位數(shù)、出生年月日是否正確,可以糾正大部分的輸入錯誤。- -- Access 不支持 Substring 查詢,可以替換為 mid 查詢。
- select 序號,姓名,身份證號,性別
- from 身份表
- where (len(身份證號)<>15 and len(身份證號)<>18)
- or (len(身份證號)=15 and ((Substring(身份證號,9,2)>12)
- or (Substring(身份證號,11,2) > 31)
- or (Substring(身份證號,9,2) in (01,03,05,07,08,10,12) and Substring(身份證號,11,2)>31)
- or (Substring(身份證號,9,2) in (04,06,09,11) and Substring(身份證號,11,2)>30)
- or (Substring(身份證號,9,2)=02 and Substring(身份證號,11,2)>29)))
- or (len(身份證號)=18 and (Substring(身份證號,7,2)<'19' or Substring(身份證號,7,2)>'20'
- or (Substring(身份證號,11,2)>12)
- or (Substring(身份證號,11,2) in (01,03,05,07,08,10,12) and Substring(身份證號,13,2)>31)
- or (Substring(身份證號,11,2) in (04,06,09,11) and Substring(身份證號,13,2)>30)
- or (Substring(身份證號,11,2)=02 and Substring(身份證號,13,2)>29)))
- ---------------------- 下面是針對 15位 及18位 身份證號碼性別的驗證語句 ------------------
- -- Access 不支持 Substring 查詢,可以替換為 mid 查詢。
- select 序號,姓名,身份證號,性別
- from 身份表
- where (((len(身份證號)=15) and (Substring(身份證號,15,1) in (1,3,5,7,9)) and 性別<>'男')
- or ((len(身份證號)=15) and (Substring(身份證號,15,1) in (2,4,6,8,0)) and 性別<>'女'))
- or (((len(身份證號)=18) and (Substring(身份證號,17,1) in (1,3,5,7,9)) and 性別<>'男')
- or ((len(身份證號)=18) and (Substring(身份證號,17,1) in (2,4,6,8,0)) and 性別<>'女'))
-
-
- --身份證有效性校驗函數(shù)
- IF OBJECT_ID(N'dbo.fun_IsValidID') >0
- DROP FUNCTION dbo.fun_IsValidID
- GO
- CREATE FUNCTION dbo.fun_IsValidID(@ID Varchar(18))
- -- Add the parameters for the stored procedure here
- RETURNS BIT
- AS
- BEGIN
- DECLARE @ValidFactors VARCHAR(17),
- @ValidCodes VARCHAR(11),
- @I TINYINT,
- @iTemp INT
- --位數(shù)不滿足則為非法ID
- IF Len(@ID) <> 15 AND Len(@ID) <> 18
- RETURN(0);
- --如果是15位身份證 則只驗證日期和是否數(shù)字格式
- IF LEN(@ID)=15
- IF ISDATE('19'+SUBSTRING(@ID,7,6))=0
- OR LEFT(@ID,15) NOT LIKE REPLICATE('[0-9]',15)
- RETURN(0);
- ELSE
- RETURN(1);
- /*18位身份證 驗證日期 校驗位 */
- --驗證日期和前17位是否數(shù)字格式
- IF ISDATE(SUBSTRING(@ID,7,8))=0
- OR LEFT(@ID,17) NOT LIKE REPLICATE('[0-9]',17)
- RETURN(0);
- --驗證校驗位開始
- SELECT @ValidFactors='79A584216379A5842',
- @ValidCodes='10X98765432',@I=1,@iTemp=0
- WHILE @i<18
- BEGIN
- SELECT
- @iTemp=@iTemp+CAST(SUBSTRING(@ID,@i,1) AS INT)*(CASE SUBSTRING(@validFactors,@i,1) WHEN 'A' THEN 10 ELSE SUBSTRING(@ValidFactors,@i,1) END)
- ,@i=@i+1
- END
- IF SUBSTRING(@ValidCodes,@iTemp%11+1,1)=RIGHT(@ID,1)
- RETURN(1);
- ELSE
- RETURN(0);
-
- RETURN NULL;
- END
- GO
復制代碼 |
|