2

これは、古い問題の特定の例です: 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 と見なすことは理にかなっているかもしれません。

4

4 に答える 4

1

同じ問題があり、現在は として保存していますyyyyMMdd-xxxxが、今日これを再設計する場合は、日付の検証を処理yyyyMMddするdateフィールドに を保存し、他の 4 つの値を nchar(4 )、その唯一の数を確保するための制約を追加します。

于 2014-11-27T14:51:26.187 に答える
1

VARCHAR最も単純な方法であるため、固定長で使用します。また、スペースの節約が実際の設計目標となるように、あなたの組織が 950 万人のすべての住民の数を保存するとは思いませんか? :)

于 2012-12-08T17:03:53.960 に答える
1

したがって、私が理解しているように、ハイフン/プラス記号は、2 桁の年の形式にのみ必要です。

私があなたなら、アプリケーション側で 4 桁の年形式に変換します (ハイフンを削除します)。次に、結果の値を整数として保存します。あなたが述べたように、これはスペースを節約し、値を数学的に変換することを可能にします (個人番号ではこれは無関係かもしれませんが)。

ここで重要なのは、データベースで 2 つの異なる形式を管理しようとするのではなく、 1 つの形式を選択することです。これは、アプリケーションの一貫性にもつながります。1 つまたは別の形式を必要とする外部アプリケーションに関しては、トランスフォームを転送コードに配置できます。

余談ですが、2 桁の年の形式 (ハイフン / プラスを数字に置き換える限り) を 4 年の形式に自動的に割り当てるトリガーを作成するのはかなり簡単です。

于 2012-12-08T17:06:13.097 に答える
1

標準形式 201201013842 を (VARCHAR ではなく) CHAR として保存します。

要するに、数字のセマンティクスを制御することはできません (スウェーデンの当局は制御します)。ある時点で数字以外の文字を数字に追加することを決定した場合 (数字は古い形式で既に行われているように)、変更に対処するための準備が整います。

于 2012-12-08T17:17:09.007 に答える