設為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 6702|回復: 6
打印 上一主題 下一主題

[其它] 【分享】18位身份證校驗位的計算方法

[復制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-11-17 16:47:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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ù)、出生年月日是否正確,可以糾正大部分的輸入錯誤。
  1. -- Access 不支持 Substring 查詢,可以替換為 mid 查詢。

  2. select 序號,姓名,身份證號,性別
  3. from 身份表
  4. where (len(身份證號)<>15 and len(身份證號)<>18)
  5. or (len(身份證號)=15 and ((Substring(身份證號,9,2)>12)
  6. or (Substring(身份證號,11,2) > 31)
  7. or (Substring(身份證號,9,2) in (01,03,05,07,08,10,12) and Substring(身份證號,11,2)>31)
  8. or (Substring(身份證號,9,2) in (04,06,09,11) and Substring(身份證號,11,2)>30)
  9. or (Substring(身份證號,9,2)=02 and Substring(身份證號,11,2)>29)))

  10. or (len(身份證號)=18 and (Substring(身份證號,7,2)<'19' or Substring(身份證號,7,2)>'20'
  11.         or (Substring(身份證號,11,2)>12)
  12. or (Substring(身份證號,11,2) in (01,03,05,07,08,10,12) and Substring(身份證號,13,2)>31)
  13. or (Substring(身份證號,11,2) in (04,06,09,11) and Substring(身份證號,13,2)>30)
  14. or (Substring(身份證號,11,2)=02 and Substring(身份證號,13,2)>29)))


  15. ---------------------- 下面是針對 15位 及18位 身份證號碼性別的驗證語句 ------------------

  16. -- Access 不支持 Substring 查詢,可以替換為 mid 查詢。

  17. select 序號,姓名,身份證號,性別
  18. from 身份表
  19. where (((len(身份證號)=15) and (Substring(身份證號,15,1) in (1,3,5,7,9)) and 性別<>'男')
  20. or ((len(身份證號)=15) and (Substring(身份證號,15,1) in (2,4,6,8,0)) and 性別<>'女'))

  21. or (((len(身份證號)=18) and (Substring(身份證號,17,1) in (1,3,5,7,9)) and 性別<>'男')
  22. or ((len(身份證號)=18) and (Substring(身份證號,17,1) in (2,4,6,8,0)) and 性別<>'女'))





  23. --身份證有效性校驗函數(shù)

  24. IF  OBJECT_ID(N'dbo.fun_IsValidID') >0
  25.     DROP FUNCTION dbo.fun_IsValidID
  26. GO

  27. CREATE FUNCTION dbo.fun_IsValidID(@ID Varchar(18))
  28. -- Add the parameters for the stored procedure here
  29. RETURNS BIT
  30. AS
  31. BEGIN
  32.   DECLARE @ValidFactors VARCHAR(17),
  33.     @ValidCodes VARCHAR(11),
  34.           @I TINYINT,
  35.           @iTemp INT

  36.   --位數(shù)不滿足則為非法ID

  37.   IF Len(@ID) <> 15 AND Len(@ID) <> 18
  38. RETURN(0);

  39.   --如果是15位身份證 則只驗證日期和是否數(shù)字格式
  40.   IF LEN(@ID)=15  
  41.     IF ISDATE('19'+SUBSTRING(@ID,7,6))=0
  42.         OR LEFT(@ID,15) NOT LIKE REPLICATE('[0-9]',15)
  43.       RETURN(0);
  44.     ELSE
  45.       RETURN(1);

  46.   /*18位身份證 驗證日期 校驗位 */

  47.     --驗證日期和前17位是否數(shù)字格式
  48.   IF ISDATE(SUBSTRING(@ID,7,8))=0

  49.       OR LEFT(@ID,17) NOT LIKE REPLICATE('[0-9]',17)

  50.       RETURN(0);

  51. --驗證校驗位開始
  52.   SELECT @ValidFactors='79A584216379A5842',
  53.    @ValidCodes='10X98765432',@I=1,@iTemp=0

  54.   WHILE @i<18
  55.   BEGIN      
  56.      SELECT
  57.        @iTemp=@iTemp+CAST(SUBSTRING(@ID,@i,1) AS INT)*(CASE SUBSTRING(@validFactors,@i,1) WHEN 'A' THEN 10 ELSE SUBSTRING(@ValidFactors,@i,1) END)
  58.        ,@i=@i+1
  59.   END

  60.   IF SUBSTRING(@ValidCodes,@iTemp%11+1,1)=RIGHT(@ID,1)
  61.     RETURN(1);
  62.   ELSE
  63.     RETURN(0);
  64.   
  65.   RETURN NULL;
  66. END
  67. GO


復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2011-11-17 18:04:07 | 只看該作者
先頂后下,O(∩_∩)O謝謝,拿分走人~~
3#
發(fā)表于 2011-11-17 19:05:11 | 只看該作者
開心GG應該說明下是在SQL Sever存儲過程里處理的嘛~~
4#
發(fā)表于 2011-11-18 09:21:28 | 只看該作者
謝謝分享

點擊這里給我發(fā)消息

5#
發(fā)表于 2011-11-18 10:26:18 | 只看該作者
學習一下
6#
發(fā)表于 2015-7-16 17:13:45 | 只看該作者
開心GG應該說明下是在SQL Sever存儲過程里處理的嘛~~{:soso_e120:}
7#
發(fā)表于 2017-2-7 23:54:41 | 只看該作者
學習
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 05:04 , Processed in 0.095112 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表