isn
モジュールは、EAN13、UPC、ISBN (書籍)、ISMN (音楽)、ISSN (連番)という国際的な標準製品番号に従うデータ型を提供します。
番号は入力時にハードコードされた接頭辞の一覧に基づいて検証されます。
この接頭辞の一覧は出力時に数字にハイフンを付けるのにも使われます。
新しい接頭辞が時々追加されますので、接頭辞の一覧は古くなっているかもしれません。
このモジュールの将来のバージョンでは、必要なときにユーザが簡単に更新できる一つもしくは複数のテーブルから接頭辞の一覧を取得することが望まれます。
しかし、現時点では、一覧はソースコードを修正し再コンパイルすることでしか更新できません。
あるいは、接頭辞の検証とハイフン付けのサポートはこのモジュールの将来のバージョンからは外されるかもしれません。
このモジュールは「trusted」と見なされます。つまり、現在のデータベースに対してCREATE
権限を持つ非スーパーユーザがインストールできます。
表 F.11にisn
モジュールで提供されるデータ型を示します。
表F.11 isn
データ型
データ型 | 説明 |
---|---|
EAN13 | ヨーロッパ統一商品コード。 常にEAN13用表示形式で表示されます。 |
ISBN13 | 国際標準図書番号。 新しいEAN13用表示形式で表示されます。 |
ISMN13 | 国際標準楽譜番号。 新しいEAN13用表示形式で表示されます。 |
ISSN13 | 国際標準逐次刊行物番号。 新しいEAN13用表示形式で表示されます。 |
ISBN | 国際標準図書番号。 旧式の簡略表示形式で表示されます。 |
ISMN | 国際標準楽譜番号。 旧式の簡略表示形式で表示されます。 |
ISSN | 国際標準逐次刊行物番号。 旧式の簡略表示形式で表示されます。 |
UPC | 統一商品コード。 |
数点注意事項があります。
ISBN13、ISMN13、ISSN13番号はすべてEAN13数値です。
EAN13番号は必ずISBN13、ISMN13、ISSN13のいずれかであるという訳ではありません (一部はそうです)。
一部のISBN13番号はISBNとして表示可能です。
一部のISMN13番号はISMNとして表示可能です。
一部のISSN13番号はISSNとして表示可能です。
UPC番号はEAN13番号の部分集合です(基本的にはEAN13から先頭の0
の数字を取り除いたものです)。
すべてのUPC、ISBN、ISMN、ISSNはEAN13番号として表現可能です。
すべての型は内部的には同一表現(64ビット整数)を使用し、すべて相互交換が可能です。 複数の型は、表示書式を制御する、および、番号のある特定の型を表さなければならない入力に対する有効性検査をより強く行えるようにするために提供されています。
ISBN
、ISMN
、ISSN
型では、可能ならば番号の簡略表示形式(ISxN 10)で表示されます。
簡略形式に合わない番号ではISxN 13書式で表示されます。
EAN13
、ISBN13
、ISMN13
、ISSN13
型では常にISxNの長めの形式(EAN13)で表示されます。
isn
モジュールは以下の型の組合せに関するキャストを提供します。
ISBN13 <=> EAN13
ISMN13 <=> EAN13
ISSN13 <=> EAN13
ISBN <=> EAN13
ISMN <=> EAN13
ISSN <=> EAN13
UPC <=> EAN13
ISBN <=> ISBN13
ISMN <=> ISMN13
ISSN <=> ISSN13
EAN13
から他の型へキャストする時、その値が他の型のドメイン内であるかどうか実行時に検査が行われます。
ドメイン内になければエラーが発生します。
他のキャストでは単にラベル付けを再実行するだけですので、常に成功します。
isn
モジュールは標準的な比較演算子とこれらデータ型すべてに対するB-treeおよびハッシュインデックスサポートを提供します。
さらに、表 F.12で示される複数の特化した関数も存在します。
以下の表ではisn
はこのモジュールのデータ型のいずれか1つを意味します。
表F.12 isn
Functions
weakモードは無効なデータをテーブルに挿入できるようにするために使用されます。 無効とは間違ったチェックディジットを意味するものであり、番号自体は存在します。
このweakモードを使いたいと考えるのは何故でしょうか。 大規模なISBN番号群があり、その内の多くが何らかの理由で間違ったチェックディジットを持つことはあり得ます。 (印刷された一覧をスキャンしてOCRした結果番号を間違えた場合、手作業で番号を取り出した場合などがあり得ます。) とにかく、こうした混乱は整理したいことですが、データベース内に番号をすべて取り込んで、より簡単に情報を検査し有効にすることができるように、外部ツールを使用してデータベース内の無効な番号の位置を特定したいと思うかも知れません。 例えば、テーブル内の無効な番号をすべて選択したいと思うかも知れません。
weakモードを使用して無効な番号をテーブルに挿入する時、番号は修正されたチェックディジット付きで挿入されますが、最後にイクスクラメーション印(!
)付きで、例えば0-11-000322-5!
と表示されます。
この無効印はis_valid
関数を使って検査することができ、また、 make_valid
関数で消去することができます。
また、番号の最後に!
文字を付与することで、weakモードでなくとも無効な番号を強制的に挿入することもできます。
この他の入力における特殊な機能として、チェックディジットとして?
を書くことができます。
これにより正確なチェックディジットが自動的に挿入されます。
---型を直接使う SELECT isbn('978-0-393-04002-9'); SELECT isbn13('0901690546'); SELECT issn('1436-4522'); --型キャスト -- 番号が対象の型の範囲として有効な場合にのみean13から他の型へキャストできることに注意 -- そのため、次のようなものは上手くいかない: select isbn(ean13('0220356483481')); -- しかし以下は上手くいく SELECT upc(ean13('0220356483481')); SELECT ean13(upc('220356483481')); --ISBN番号を保持する列が1つあるテーブルを作成する CREATE TABLE test (id isbn); INSERT INTO test VALUES('9780393040029'); --チェックディジットを自動的に計算する('?'を見よ) INSERT INTO test VALUES('220500896?'); INSERT INTO test VALUES('978055215372?'); SELECT issn('3251231?'); SELECT ismn('979047213542?'); --weakモードを利用する 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;
本モジュールを実装するための情報は以下を含むいくつかのサイトを通して集められました。
ハイフン付けに使用した接頭辞も以下から集められました。
アルゴリズムの作成には注意を払い、公式ISBN、ISMN、ISSNユーザマニュアルで提示されたアルゴリズムに対して念入り過ぎるほど検証されました。
Germán Méndez Bravo (Kronuz), 2004–2006
本モジュールはGarrett A. Wollmanのisbn_issn
コードに触発されたものです。