On this page
F.19. isn
isn
模块提供以下国际产品编号标准的数据类型:EAN13,UPC,ISBN(书籍),ISMN(音乐)和 ISSN(序列号)。根据前缀的硬编码列表,数字在 Importing 时经过验证;此前缀列表还用于在输出中连字符。由于不时分配新的前缀,因此前缀列表可能已过期。希望该模块的将来版本将从一个或多个表中获取前缀列表,以便用户根据需要轻松更新这些列表;但是,目前只能通过修改源代码并重新编译来更新列表。或者,可以从该模块的将来版本中删除前缀验证和断字支持。
F.19.1. 资料类型
Table F.11显示isn
模块提供的数据类型。
表 F.11.isn
数据类型
Data Type | Description |
---|---|
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 进行更严格的有效性检查。
ISBN
,ISMN
和ISSN
类型将在可能的情况下显示数字的缩写形式(ISxN 10),并为不适合该缩写形式的数字显示 ISxN 13 格式。 EAN13
,ISBN13
,ISMN13
和ISSN13
类型将始终显示 ISxN 的长版本(EAN13)。
F.19.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.19.3. 功能和运算符
isn
模块提供了标准比较运算符,并为所有这些数据类型提供了 B 树和哈希索引支持。此外,还有一些专门功能;显示在Table F.12中。在此表中,isn
表示模块的任何一种数据类型。
表 F.12.isn
功能
Function | Returns | Description |
---|---|---|
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.19.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.19.5. Bibliography
从多个站点收集了用于实现此模块的信息,包括:
用于断字的前缀还来自以下格式:
https://en.wikipedia.org/wiki/List_of_ISBN_identifier_groups
https://www.isbn-international.org/content/isbn-users-manual
https://en.wikipedia.org/wiki/International_Standard_Music_Number
在创建算法时要格外小心,并已根据官方 ISBN,ISMN,ISSN 用户手册中的建议算法精心验证了它们。
F.19.6. Author
GermánMéndezBravo(克鲁努斯),2004 年-2006 年
该模块的灵感来自 Garrett A. Wollman 的isbn_issn
代码。