他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.19. isn

isnモジュールは、EAN13、UPC、ISBN (書籍)、ISMN (音楽)、ISSN (連番)という国際的な標準製品番号に従うデータ型を提供します。 番号は入力時にハードコードされた接頭辞の一覧に基づいて検証されます。 この接頭辞の一覧は出力時に数字にハイフンを付けるのにも使われます。 新しい接頭辞が時々追加されますので、接頭辞の一覧は古くなっているかもしれません。 このモジュールの将来のバージョンでは、必要なときにユーザが簡単に更新できる一つもしくは複数のテーブルから接頭辞の一覧を取得することが望まれます。 しかし、現時点では、一覧はソースコードを修正し再コンパイルすることでしか更新できません。 あるいは、接頭辞の検証とハイフン付けのサポートはこのモジュールの将来のバージョンからは外されるかもしれません。

F.19.1. データ型

表F-10isnモジュールで提供されるデータ型を示します。

表 F-10. 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. 一部のISSN13番号はISSNとして表示可能です。

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

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

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

ISBNISMNISSN型では、可能ならば番号の簡略表示形式(ISxN 10)で表示されます。 簡略形式に合わない番号ではISxN 13書式で表示されます。 EAN13ISBN13ISMN13ISSN13型では常にISxNの長めの形式(EAN13)で表示されます。

F.19.2. キャスト

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

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

F.19.3. 関数と演算子

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

表 F-11. isn関数

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

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

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

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

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

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

F.19.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.19.5. 参考文献

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

ハイフン付けに使用した接頭辞も以下から集められました。

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

F.19.6. 作者

Germán Méndez Bravo (Kronuz), 2004 - 2006

本モジュールはGarrett A. Wollmanのisbn_issnコードに触発されたものです。