支持的版本: 当前 (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.6. 作者 #

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

此模块的灵感来自 Garrett A. Wollman 的 isbn_issn 代码。

提交更正

如果您在文档中发现任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。