F.20. isn

isn模块提供以下国际产品编号标准的数据类型:EAN13,UPC,ISBN(书籍),ISMN(音乐)和 ISSN(序列号)。根据前缀的硬编码列表,数字在 Importing 时经过验证;此前缀列表还用于在输出中连字符。由于不时分配新的前缀,因此前缀列表可能已过期。希望该模块的将来版本将从一个或多个表中获取前缀列表,以便用户根据需要轻松更新这些列表;但是,目前只能通过修改源代码并重新编译来更新列表。或者,可以从该模块的将来版本中删除前缀验证和断字支持。

F.20.1. 资料类型

Table F.12显示isn模块提供的数据类型。

表 F.12.isn数据类型

Data TypeDescription
EAN13欧洲商品编号,始终以 EAN13 显示格式显示
ISBN13国际标准书号以新的 EAN13 显示格式显示
ISMN13国际标准音乐编号将以新的 EAN13 显示格式显示
ISSN13国际标准序列号将以新的 EAN13 显示格式显示
ISBN国际标准书号以旧的短显示格式显示
ISMN国际标准音乐编号将以旧的短显示格式显示
ISSN国际标准序列号以旧的短显示格式显示
UPC通用产品代码

Some notes:

  • ISBN13,ISMN13,ISSN13 号均为 EAN13 号。

  • EAN13 编号并不总是 ISBN13,ISMN13 或 ISSN13(有些是)。

  • 某些 ISBN13 编号可以显示为 ISBN。

  • 某些 ISMN13 编号可以显示为 ISMN。

  • 某些 ISSN13 编号可以显示为 ISSN。

  • UPC 号是 EAN13 号的子集(它们基本上是 EAN13,没有前0位)。

  • 所有 UPC,ISBN,ISMN 和 ISSN 编号都可以表示为 EAN13 编号。

在内部,所有这些类型都使用相同的表示形式(64 位整数),并且所有类型都可以互换。提供了多种类型来控制显示格式并允许对表示一种特定类型数字的 Importing 进行更严格的有效性检查。

ISBNISMNISSN类型将在可能的情况下显示数字的缩写形式(ISxN 10),并为不适合该缩写形式的数字显示 ISxN 13 格式。 EAN13ISBN13ISMN13ISSN13类型将始终显示 ISxN 的长版本(EAN13)。

F.20.2. Casts

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 树和哈希索引支持。此外,还有一些专门功能;显示在Table F.13中。在此表中,isn表示模块的任何一种数据类型。

表 F.13.isn功能

FunctionReturnsDescription
isn_weak(boolean) boolean设置弱 Importing 模式(返回新设置)
isn_weak()boolean获取弱模式的当前状态
make_valid(isn) isn验证无效数字(清除无效标志)
is_valid(isn) boolean检查是否存在无效标志

模式用于将无效数据插入表中。无效表示校验位错误,而不是缺少数字。

为什么要使用弱模式?好吧,可能是因为您有大量的 ISBN 号,并且有太多这样的 ISBN 号,出于奇怪的原因,有些校验位不正确(也许是从打印列表中扫描的数字,而 OCR 却得到了错误的数字) ,也许是手动捕获的数字...谁知道)。无论如何,关键是您可能希望清理混乱,但是您仍然希望能够将所有数字存储在数据库中,并可以使用外部工具在数据库中查找无效数字,以便您可以验证信息并更容易验证;因此,例如,您想选择表格中的所有无效数字。

当您使用弱模式在表中插入无效数字时,该数字将带有更正的校验位插入,但最后将显示带有感叹号(!),例如0-11-000322-5!。可以使用is_valid功能检查此无效标记,并使用make_valid功能清除该无效标记。

您还可以通过在数字末尾附加!字符来强制插入无效数字,即使不在弱模式下也是如此。

另一个特殊功能是在 Importing 过程中,您可以 Importing?代替校验位,正确的校验位将被自动插入。

F.20.4. Examples

--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. Bibliography

从多个站点收集了用于实现此模块的信息,包括:

用于断字的前缀还来自以下格式:

在创建算法时要格外小心,并已根据官方 ISBN,ISMN,ISSN 用户手册中的建议算法精心验证了它们。

F.20.6. Author

GermánMéndezBravo(克鲁努斯),2004 年-2006 年

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