# F.19.不是吗

F.19.1.数据类型F.19.2.铸造F.19.3.函数和运算符F.19.4.例子F.19.5.参考文献F.19.6.著者

这个不是吗模块为以下国际产品编号标准提供数据类型:EAN13、UPC、ISBN(图书)、ISMN(音乐)和ISSN(系列)。根据前缀的硬编码列表,在输入时验证数字;此前缀列表还用于在输出时对数字进行连字符。由于新前缀会不时被分配,前缀列表可能已经过时。希望该模块的未来版本将从一个或多个用户可以根据需要轻松更新的表中获取前缀列表;然而,目前只能通过修改源代码和重新编译来更新列表。或者,该模块的未来版本可能会放弃前缀验证和断字支持。

该模块被认为是“受信任的”,也就是说,它可以由拥有创造当前数据库的权限。

# F.19.1.数据类型

表F.11显示由提供的数据类型不是吗单元

表F.11.不是吗数据类型

数据类型 描述
EAN13 欧洲商品编号,始终以EAN13显示格式显示
ISBN13 以新的EAN13显示格式显示的国际标准书号
ISMN13 以新的EAN13显示格式显示的国际标准音乐号码
ISSN13 以新的EAN13显示格式显示的国际标准序列号
ISBN 以旧的短显示格式显示的国际标准书号
ISMN 以旧的短显示格式显示的国际标准音乐号码
伊森 以旧的短显示格式显示的国际标准序列号
UPC 通用产品代码

注意:

  1. ISBN13、ISMN13、ISSN13号都是EAN13号。

  2. EAN13数字并不总是ISBN13、ISMN13或ISSN13(有些是)。

  3. 一些ISBN13数字可以显示为ISBN。

  4. 一些ISMN13数字可以显示为ISMN。

  5. 一些ISSN13数字可以显示为ISSN。

  6. UPC编号是EAN13编号的一个子集(基本上是没有第一个编号的EAN13)0数字)。

  7. 所有UPC、ISBN、ISMN和ISSN编号都可以表示为EAN13编号。

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

    这个ISBN, ISMN伊森只要可能,类型将显示数字的短版本(ISxN 10),对于不适合短版本的数字,类型将显示ISxN 13格式。这个EAN13, ISBN13, ISMN13ISSN13类型将始终显示ISxN(EAN13)的长版本。

# F.19.2.铸造

这个不是吗模块提供以下类型转换对:

  • ISBN13\<=> EAN13

  • ISMN13\<=> EAN13

  • ISSN13\<=> EAN13

  • ISBN\<=> EAN13

  • ISMN \<=>EAN13

  • ISSN \<=>EAN13

  • UPC \<=>EAN13

  • ISBN \<=>ISBN13

  • ISMN \<=>ISMN13

  • ISSN \<=>ISSN13

    When casting fromEAN13to another type, there is a run-time check that the value is within the domain of the other type, and an error is thrown if not. The other casts are simply relabelings that will always succeed.

# F.19.3. Functions and Operators

Theisnmodule provides the standard comparison operators, plus B-tree and hash indexing support for all these data types. In addition there are several specialized functions; shown inTable F.12. In this table,不是吗指模块的任何一种数据类型。

表F.12. 不是吗功能

作用

描述
你不软弱吗 ( 布尔值 ) → 布尔值

设置弱输入模式,并返回新设置。
你不软弱吗 () → 布尔值

返回弱模式的当前状态。
使你有效 ( 不是吗 ) → 不是吗

验证无效数字(清除无效标志)。
_有效吗 ( 不是吗 ) → 布尔值

检查是否存在无效标志。

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

为什么要使用弱模式?嗯,可能是因为你收集了大量的ISBN号,而且其中有太多的ISBN号,出于奇怪的原因,一些ISBN号的校验位是错误的(可能是从打印的列表中扫描的数字,OCR得到的数字是错误的,可能是手动捕获的数字……谁知道呢)。不管怎么说,关键是你可能想收拾残局,但你仍然希望能够在数据库中拥有所有的数字,并且可能使用外部工具来定位数据库中的无效数字,这样你就可以更容易地验证信息和验证它;例如,你需要选择表中所有的无效数字。

当使用弱模式在表格中插入无效数字时,数字将与更正的校验位一起插入,但它将以感叹号显示(!)例如,在最后0-11-000322-5!。此无效标记可通过_有效吗函数并用使你有效作用

您还可以通过添加!数字末尾的字符。

另一个特点是,在输入过程中,您可以编写?替换校验位,并自动插入正确的校验位。

# F.19.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.19.5.参考书目

实施本模块的信息来自多个网站,包括:

# F.19.6.作者

German Méndez Bravo(克朗),2004-2006年

本模块的灵感来自加勒特·A·沃尔曼的国际标准书号密码