これは、古い問題の特定の例です: SQL データベースに「番号」(電話番号、IP アドレス、社会保障番号など) を保存する方法は?
背景: スウェーデンでは、個人識別番号 ("personnummer") が非常に一般的です。政府、銀行、雇用主などと通信するときに使用します。スウェーデンで生まれた人には、生まれたときに番号が割り当てられます。私の移民の友人は、個人番号を取得し、最終的にデビットカードを取得して仕事を探し始めるまでの数週間の暗いことを嘆いています。
私の組織は、メンバーの個人番号を保存する必要があります。これには SQL データベースがあります。データはどのように保存すればよいですか?
ウィキペディアから、personnummerの形式について:
個人識別番号は、10 桁の数字とハイフンで構成されます。最初の 6 つは、YYMMDD 形式の人の誕生日に対応します。その後にハイフンが続きます。100 歳以上の人は、ハイフンをプラス記号に置き換えます。7番目から9番目までが通し番号です。奇数の 9 番目の数字は男性に割り当てられ、偶数の 9 番目の数字は女性に割り当てられます。ストックホルムなどの一部の郡当局や一部の銀行では、YYYYMMDD を許可するために 12 桁の番号を使用し始めています。この形式は、一部のスウェーデン ID カード [要説明] およびスウェーデンの欧州健康保険カードにも使用されていますが、州発行の身分証明書には使用されていません。
10 桁目は、システムがコンピューター化された 1967 年に導入されたチェックサムです。
したがって、今年生まれた人の個人番号は「120101-3842」になります。これも Y2K のため「20120101-3842」と表記されることが多く、「ハイフンをプラス記号に置き換える」ことはあまり知られていません。
データベースの列では、次のことができると思います。
- " 120101-3842
VARCHAR
"、"20120101-3842"、または "201201013842" (YYYYMMDD 形式の余分なハイフンを取得してバイトを削る) の形式で として保存します。 - フル
YYYYMMDDXXXX
を としてINTEGER
保存します。これは 32 ビットには大きすぎますが、64 ビットでは問題なく収まります。
この場合、先頭のゼロに問題はなく、VARCHAR を使用するとサイズがほぼ 2 倍になります。IP アドレスとは異なり、この数値を INTEGER として格納しても、人間が読み取るのは難しくありません (つまり、"127.0.0.1" と比較して2130706433
)。
コラムの「厳しさ」はありがたいのですが、INTEGER
目に見えない問題が発生する可能性もあると感じています。
編集: この入力をチェックサムなどで検証する必要があります。これには、個々の数字で計算を行う必要があります (乗算、合計など)。数字は実際には...ええと...数量の一部ではなく、10 進数形式の一部であるため、結局のところ、それを varchar と見なすことは理にかなっているかもしれません。