isn
模組提供了以下國際產品編號標準的 資料型別:EAN13、UPC、ISBN(圖書)、ISMN(音樂)和 ISSN(期刊)。數字在輸入時會根據硬編碼的字首列表進行驗證;此字首列表也用於在輸出時進行連字元新增。由於字首會不時分配新號碼,因此字首列表可能已過時。希望該模組的未來版本能夠從一個或多個易於使用者根據需要更新的表中獲取字首列表;然而,目前,只能透過修改原始碼並重新編譯來更新列表。或者,字首驗證和連字元支援可能會從該模組的未來版本中刪除。
此模組被認為是“受信任的”,這意味著非超級使用者也可以在其擁有的資料庫上安裝它,前提是他們具有 CREATE
許可權。
表 F.10 顯示了 isn
模組提供的資料型別。
表 F.10. 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 和 hash 索引支援。此外,還有幾個專用函式,如 表 F.11 所示。在此表中,isn
表示模組中的任何一種資料型別。
表 F.11. isn
函式
isn.weak
(boolean
) #isn.weak
啟用弱輸入模式,該模式允許在 ISN 輸入值校驗位錯誤時也接受它們。預設值為 false
,會拒絕無效的校驗位。
為什麼您想使用弱模式?嗯,可能是因為您擁有大量 ISBN 號碼,並且由於一些奇怪的原因,其中一些號碼的校驗位是錯誤的(也許號碼是從列印列表中掃描的,OCR 錯誤地讀取了號碼,也許號碼是手動輸入的……誰知道呢)。無論如何,關鍵是您可能想清理這些混亂,但仍然希望將所有號碼都保留在資料庫中,並可能使用外部工具來定位資料庫中的無效號碼,以便您可以更輕鬆地驗證資訊並確認其有效性;因此,例如,您可能希望選擇表中的所有無效號碼。
當您使用弱模式將無效號碼插入表中時,該號碼將被插入並帶有更正的校驗位,但會在末尾顯示一個感嘆號(!
),例如 0-11-000322-5!
。可以使用 is_valid
函式檢查此無效標記,並可以使用 make_valid
函式清除它。
當不處於弱模式時,您也可以透過在號碼末尾新增 !
字元來強制插入標記為無效的號碼。
另一個特殊功能是,在輸入時,您可以用 ?
替換校驗位,系統會自動插入正確的校驗位。
--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;
實現此模組的資訊來自多個網站,包括
用於連字元的prefixes也是從以下網站收集的
在建立演算法時非常謹慎,並且它們已根據官方 ISBN、ISMN、ISSN 使用者手冊中建議的演算法進行了仔細驗證。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。