isn

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ

# F.16. isn

`isn`モジュールは、EAN13、UPC、ISBN (書籍)、ISMN (音楽)、ISSN (連番)という国際的な標準製品番号に従うデータ型を提供します。 番号は入力時に検証され、出力時に正しくハイフン付けがなされます。

## F.16.1. データ型

表 F-9. `isn`データ型

データ型 | 説明
--- | ---
`EAN13` | ヨーロッパ統一商品コード。 常にEAN13用表示形式で表示されます。
`ISBN13` | 国際標準図書番号は新しいEAN13用表示形式で表示されます。
`ISMN13` | 国際標準楽譜番号は新しいEAN13用表示形式で表示されます。
`ISSN13` | 国際標準逐次刊行物番号は新しいEAN13用表示形式で表示されます。
`ISBN` | 国際標準図書番号は旧式の簡略表示形式で表示されます。
`ISMN` | 国際標準楽譜番号は旧式の簡略表示形式で表示されます。
`ISSN` | 国際標準逐次刊行物番号は旧式の簡略表示形式で表示されます。
`UPC` | 統一商品コード。

数点注意事項があります。

1. ISBN13、ISMN13、ISSN13番号はすべてEAN13数値です

2. EAN13番号は常にISBN13、ISMN13、ISSN13のいずれかではありません (一部はそうです)

3. 一部のISBN13番号はISBNとして表示可能です。

4. 一部のISMN13番号はISMNとして表示可能です。

5. 一部のISMN13番号はISSNとして表示可能です。

6. UPC番号はEAN13番号の部分集合です（基本的にはEAN13から先頭の`0`桁を取り除いたものです）。

7. すべてのUPC、ISBN、ISMN、ISSNはEAN13番号として表現可能です。

すべての型は内部的には同一表現（64ビット整数）を使用し、すべて相互交換が可能です。 複数の型は、表示書式を制御する、および、番号のある特定の型を表さなければならない入力に対する有効性検査をより強く行えるようにするために提供されています。

`ISBN`、`ISMN`、`ISSN`型では、可能ならば番号の簡略表示形式（ISxN 10）で表示されます。 簡略形式に合わない番号ではISxN 13書式で表示されます。 `EAN13`、`ISBN13`、`ISMN13`、`ISSN13`型では常にISxNの長めの形式（EAN13）で表示されます。

## F.16.2. キャスト

`isn`モジュールは以下の型の組合せに関するキャストを提供します。

- ISBN13 <=> EAN13

- ISMN13 <=> EAN13

- ISSN13 <=> EAN13

- ISBN <=> EAN13

- ISMN <=> EAN13

- ISSN <=> EAN13

- UPC <=> EAN13

- ISBN <=> ISBN13

- ISMN <=> ISMN13

- ISSN <=> ISSN13

`EAN13`から他の型へキャストする時、その値が他の型のドメイン内であるかどうか実行時に検査が行われます。 ドメイン内になければエラーが発生します。 他のキャストでは単にラベル付けを再実行するだけですので、常に成功します。

## F.16.3. 関数と演算子

`isn`モジュールは標準的な比較演算子とこれらデータ型すべてに対するB-Treeおよびハッシュインデックスサポートを提供します。 さらに、表F-10で示される複数の特化した関数も存在します。 以下の表では`isn`はこのモジュールのデータ型のいずれか1つを意味します。

表 F-10. `isn`関数

関数 | 戻り値 | 説明
--- | --- | ---
`isn_weak(boolean)` | `boolean` | 弱めの入力モードを設定します。（新しい設定を返します）
`isn_weak()` | `boolean` | 強弱モードの現在の状態を返します。
`make_valid(isn)` | `isn` | 無効な番号を有効にします（無効フラグを消去します）。
`is_valid(isn)` | `boolean` | 無効フラグの有無を検査します。

Weakモードは無効なデータをテーブルに挿入できるようにするために使用されます。 無効とは間違った検査桁を意味するものであり、番号自体は存在します。

この弱めのモードを使いたいと考えるのでしょう。 大規模なISBN番号群があり、その内の多くが何らかの理由で間違った検査桁を持つことはあり得ます。 （印刷された一覧をスキャンしてOCRした結果番号を間違えた場合、手作業で番号を取り出した場合などがあり得ます。） とにかく、こうした混乱は整理したいことですが、データベース内に番号をすべて取り込んで、テーブル内の無効な番号をすべて選択するなど、より簡単に情報を検査し有効にすることができるように、外部ツールを使用してデータベース内の無効な番号にアクセスさせたいと望むことでしょう。

弱めのモードを使用して無効な番号をテーブルに挿入する時、番号は修正された検査桁付きで挿入されますが、最後にイクスクラメーション印（`!`）、例えば`0-11-000322-5!`、がフラグとして付与されます。 この無効印は`is_valid`関数を使って検査することができ、また、 `make_valid`関数で消去することができます。

また、番号の最後に`!`文字を付与することで、弱めのモードでなくとも無効な番号を強制的に挿入することもできます。

この他の入力における特殊な機能として、検査桁として`?`を書くことができます。 これにより正確な検査桁が自動的に挿入されます。

## F.16.4. 例

    --Using the types directly:
    SELECT isbn('978-0-393-04002-9');
    SELECT isbn13('0901690546');
    SELECT issn('1436-4522');

    --Casting types:
    -- note that you can only cast from ean13 to another type when the
    -- number would be valid in the realm of the target type;
    -- thus, the following will NOT work: select isbn(ean13('0220356483481'));
    -- but these will:
    SELECT upc(ean13('0220356483481'));
    SELECT ean13(upc('220356483481'));

    --Create a table with a single column to hold ISBN numbers:
    CREATE TABLE test (id isbn);
    INSERT INTO test VALUES('9780393040029');

    --Automatically calculate check digits (observe the '?'):
    INSERT INTO test VALUES('220500896?');
    INSERT INTO test VALUES('978055215372?');

    SELECT issn('3251231?');
    SELECT ismn('979047213542?');

    --Using the weak mode:
    SELECT isn_weak(true);
    INSERT INTO test VALUES('978-0-11-000533-4');
    INSERT INTO test VALUES('9780141219307');
    INSERT INTO test VALUES('2-205-00876-X');
    SELECT isn_weak(false);

    SELECT id FROM test WHERE NOT is_valid(id);
    UPDATE test SET id = make_valid(id) WHERE id = '2-205-00876-X!';

    SELECT * FROM test;

    SELECT isbn13(id) FROM test;

## F.16.5. 参考書物

本モジュールを実装するための情報は以下を含むいくつかのサイトを通して集められました。

       http://www.isbn-international.org/
       http://www.issn.org/
       http://www.ismn-international.org/
       http://www.wikipedia.org/

ハイフン化に使用した接頭辞も以下から構成されました。

       http://www.gs1.org/productssolutions/idkeys/support/prefix_list.html
       http://www.isbn-international.org/en/identifiers.html
       http://www.ismn-international.org/ranges.html

アルゴリズムの作成には注意を払い、公式ISBN、ISMN、ISSNユーザマニュアルで提示されたアルゴリズムに対して念入り過ぎるほど検証されました。

## F.16.6. 作者

Germ疣 M駭dez Bravo (Kronuz), 2004 - 2006

本モジュールはGarrett A. Wollmanのisbn_issnコードの意向を受けたものです。

前のページ | ホーム | 次のページ
intarray | 上に戻る | lo