2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 號碼的子集(它們基本上是 EAN13 號碼去掉開頭的 0 位數字)。

  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-tree 和 hash 索引支援。此外,還有幾個專用函式,如 表 F.11 所示。在此表中,isn 表示模組中的任何一種資料型別。

表 F.11. isn 函式

函式

描述

make_valid ( isn ) → isn

清除值中的無效校驗位標誌。

is_valid ( isn ) → boolean

檢查是否存在無效校驗位標誌。

isn_weak ( boolean ) → boolean

設定弱輸入模式,並返回新設定。保留此函式是為了向後相容。設定弱模式的推薦方法是透過 isn.weak 配置引數。

isn_weak () → boolean

返回弱模式的當前狀態。保留此函式是為了向後相容。檢查弱模式的推薦方法是透過 isn.weak 配置引數。


F.20.4. 配置引數 #

isn.weak (boolean) #

isn.weak 啟用弱輸入模式,該模式允許在 ISN 輸入值校驗位錯誤時也接受它們。預設值為 false,會拒絕無效的校驗位。

為什麼您想使用弱模式?嗯,可能是因為您擁有大量 ISBN 號碼,並且由於一些奇怪的原因,其中一些號碼的校驗位是錯誤的(也許號碼是從列印列表中掃描的,OCR 錯誤地讀取了號碼,也許號碼是手動輸入的……誰知道呢)。無論如何,關鍵是您可能想清理這些混亂,但仍然希望將所有號碼都保留在資料庫中,並可能使用外部工具來定位資料庫中的無效號碼,以便您可以更輕鬆地驗證資訊並確認其有效性;因此,例如,您可能希望選擇表中的所有無效號碼。

當您使用弱模式將無效號碼插入表中時,該號碼將被插入並帶有更正的校驗位,但會在末尾顯示一個感嘆號(!),例如 0-11-000322-5!。可以使用 is_valid 函式檢查此無效標記,並可以使用 make_valid 函式清除它。

當不處於弱模式時,您也可以透過在號碼末尾新增 ! 字元來強制插入標記為無效的號碼。

另一個特殊功能是,在輸入時,您可以用 ? 替換校驗位,系統會自動插入正確的校驗位。

F.20.5. 示例 #

--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:
SET isn.weak TO true;
INSERT INTO test VALUES('978-0-11-000533-4');
INSERT INTO test VALUES('9780141219307');
INSERT INTO test VALUES('2-205-00876-X');
SET isn.weak TO 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.6. 參考文獻 #

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

用於連字元的prefixes也是從以下網站收集的

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

F.20.7. 作者 #

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

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

提交更正

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