支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.20. isn — 國際標準號碼的資料類型(ISBN、EAN、UPC 等) #

isn 模組為以下國際產品編碼標準提供資料類型:EAN13、UPC、ISBN(書籍)、ISMN(音樂)和 ISSN(期刊)。 根據硬編碼的前綴列表驗證輸入的號碼; 此前綴列表也用於在輸出時將號碼加上連字號。 由於不時會分配新的前綴,因此前綴列表可能已過時。 希望此模組的未來版本將從一個或多個表中獲取前綴列表,這些表可以根據需要由使用者輕鬆更新; 但是,目前,只能透過修改原始程式碼並重新編譯來更新列表。 或者,可以從此模組的未來版本中刪除前綴驗證和連字號支援。

此模組被視為受信任的,也就是說,具有目前資料庫的 CREATE 權限的非超級使用者可以安裝它。

F.20.1. 資料類型 #

表 F.10 顯示了 isn 模組提供的資料類型。

表 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 號碼的子集(它們基本上是沒有第一個 0 數字的 EAN13)。

  7. 所有 UPC、ISBN、ISMN 和 ISSN 號碼都可以表示為 EAN13 號碼。

在內部,所有這些類型都使用相同的表示形式(一個 64 位元整數),並且都是可互換的。 提供多種類型以控制顯示格式,並允許對旨在表示一種特定類型號碼的輸入進行更嚴格的有效性檢查。

ISBNISMNISSN 類型將在可能的情況下顯示號碼的簡短版本(ISxN 10),並且對於不適合簡短版本的號碼,將顯示 ISxN 13 格式。 EAN13ISBN13ISMN13ISSN13 類型將始終顯示 ISxN 的長版本 (EAN13)。

F.20.2. 轉換 #

isn 模組提供以下類型的轉換對

  • ISBN13 <=> EAN13

  • ISMN13 <=> EAN13

  • ISSN13 <=> EAN13

  • ISBN <=> EAN13

  • ISMN <=> EAN13

  • ISSN <=> EAN13

  • UPC <=> EAN13

  • ISBN <=> ISBN13

  • ISMN <=> ISMN13

  • ISSN <=> ISSN13

EAN13 轉換為另一種類型時,會執行執行時間檢查,以確保該值位於另一種類型的域內,如果不是,則會拋出錯誤。 其他轉換只是重新標記,將始終成功。

F.20.3. 函數和運算符 #

isn 模組提供標準的比較運算子,以及 B 樹和雜湊索引支援給所有這些資料類型。此外,還有一些特殊的函式;如表 F.11所示。在此表中,isn 表示模組中的任何一個資料類型。

表 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.20.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.20.5. 參考書目 #

實作此模組的資訊來自多個網站,包括

用於連字號的前綴也是從以下網址編譯的

在建立演算法時已非常謹慎,並且根據官方 ISBN、ISMN、ISSN 使用者手冊中建議的演算法進行了仔細驗證。

F.20.6. 作者 #

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

此模組的靈感來自 Garrett A. Wollman 的 isbn_issn 程式碼。

提交更正

如果您在文件中發現任何不正確、與您的特定功能體驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。