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 号码的子集(它们基本上是不带第一个 0
数字的 EAN13)。
所有 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 树和哈希索引支持。此外,还有几个专门的函数;如表 F.11所示。在此表中,isn
表示模块的任何一种数据类型。
表 F.11. isn
函数
弱模式用于能够将无效数据插入到表中。无效意味着校验位错误,而不是缺少数字。
为什么要使用弱模式?嗯,可能是您有大量的 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: 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;
收集了多个站点的信息以实现此模块,包括
用于连字符的前缀也来自
在算法的创建过程中非常谨慎,并根据官方 ISBN、ISMN、ISSN 用户手册中建议的算法进行了仔细验证。
如果您在文档中发现任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。