這是一個老問題的具體實例:如何在SQL數據庫中存儲「號碼」(例如電話號碼,IP地址,社會安全號碼)?SQL中的瑞典語「personnummer」(個人身份號碼)
背景:在瑞典,個人識別號碼(「personnummer」)非常普遍:您在與政府,銀行,您的僱主等進行溝通時使用它們。出生時在瑞典出生的人會被分配。我的移民朋友在他們找到一個人之前幾個星期哀悼黑暗的幾個星期,終於可以拿到一張借記卡並開始找工作。
我的組織需要存儲我們會員的人員。我們有一個SQL數據庫。 我應該如何存儲數據?
維基百科,關於personnummer的格式:
的個人身份號碼由10位數字和一個連字符。前六個對應於該人的生日,以YYMMDD形式。後面跟一個連字符。 100歲以上的人用正號代替連字符。第七到第九是序列號。奇數第九個數字分配給男性,偶數第九個數字分配給女性。斯德哥爾摩和一些銀行等一些縣級機構已經開始使用12位數字來允許YYYYMMDD。這種格式也用於瑞典的一些身份證明[需要說明]和瑞典歐洲健康保險卡,但不包括國家簽發的身份證件。
第十位是1967年系統計算機化時引入的校驗和。
因此,對於今年出生的人來說,一個人可能是「120101-3842」。由於Y2K的原因,這通常也被格式化爲「20120101-3842」,並且「用加號替換連字符」並不衆所周知。
在數據庫列,我想我可以:
- 存儲它作爲一個
VARCHAR
,格式爲「120101-3842」,「20120101-3842」或「201201013842」(通過獲取剃一個字節在YYYYMMDD格式中多餘的連字符)。 - 將整個
YYYYMMDDXXXX
存儲爲INTEGER
,這對於32位來說太大了,但在64位中沒有問題。
在這種情況下,前導零不會有任何問題,並且使用VARCHAR幾乎是其大小的兩倍。與IP地址不同,將此號碼存儲爲INTEGER並不會使人難以閱讀(即「127.0.0.1」與2130706433
相比)。
我讚賞INTEGER
專欄的「嚴格性」,但也認爲這可能會遇到看不見的問題。
編輯:我們有一個真正的需要驗證這個輸入與校驗和等等,這需要做個人數字(乘法,求和等)的數學。由於數字不是真的......呃......數量的一部分,而是十進制格式,所以最終認爲它是一個varchar是有意義的。
將它存儲爲一個varchar並創建一個檢查約束(例如使用正則表達式)來驗證內容(只有數字,最少10個字符等) –
如何在javascript中驗證它? –
@YatinMistry我認爲這個問題有點偏離主題。使用簡單的[Luhn算法](https://en.wikipedia.org/wiki/Luhn_algorithm)完成personummer的驗證。通過谷歌搜索,我發現了一個[使用jQuery實現](https://github.com/wallin/jquery-validate-personnummer),但創建自己的代碼很簡單。 – vicvicvic