isn.zh.md 7.1 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
## F.19。不是吗

[F.19.1。数据类型](isn.html#id-1.11.7.28.5)[F.19.2。铸造](isn.html#id-1.11.7.28.6)[F.19.3。函数和运算符](isn.html#id-1.11.7.28.7)[F.19.4。例子](isn.html#id-1.11.7.28.8)[F.19.5。参考文献](isn.html#id-1.11.7.28.9)[F.19.6。著者](isn.html#id-1.11.7.28.10)

[](<>)

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

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

### F.19.1。数据类型

[表F.11](isn.html#ISN-DATATYPES)显示由提供的数据类型`不是吗`单元

**表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`, `ISMN13`和`ISSN13`类型将始终显示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 from`EAN13`to 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

The`isn`module 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 in[Table F.12](isn.html#ISN-FUNCTIONS). In this table,`不是吗`指模块的任何一种数据类型。

**表F.12。 `不是吗`功能**

| 作用<br/><br/>描述 |
| -------------- |
| [](<>) `你不软弱吗` ( `布尔值` ) → `布尔值`<br/><br/>设置弱输入模式,并返回新设置。 |
| `你不软弱吗` () → `布尔值`<br/><br/>返回弱模式的当前状态。 |
| [](<>) `使你有效` ( `不是吗` ) → `不是吗`<br/><br/>验证无效数字(清除无效标志)。 |
| [](<>) `_有效吗` ( `不是吗` ) → `布尔值`<br/><br/>检查是否存在无效标志。 |

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

为什么要使用弱模式?嗯,可能是因为你收集了大量的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。参考书目

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

-   <https://www.isbn-international.org/>

-   <https://www.issn.org/>

-   <https://www.ismn-international.org/>

-   <https://www.wikipedia.org/>

    用于连字号的前缀也来自:

-   <https://www.gs1.org/standards/id-keys>

-   [https://en.wikipedia.org/wiki/List\_属于\_ISBN\_标识符\_组](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\_标准\_音乐\_数字](https://en.wikipedia.org/wiki/International_Standard_Music_Number)

-   <https://www.ismn-international.org/ranges.html>

    在创建算法的过程中非常小心,并根据ISBN、ISMN、ISSN用户手册中建议的算法进行了仔细验证。

### F.19.6。作者

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

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