Documentation PostgreSQL 15.15 » Annexes » Modules supplémentaires fournis » isn

Précédent | Niveau supérieur | Suivant
F.20. intarray | Sommaire | F.22. lo

## F.21. isn

Le module `isn` fournit des types de données pour les standards internationaux de numérotation suivants : EAN13, UPC, ISBN (livres), ISMN (musique) et ISSN (numéro de série). Les nombres sont validés en saisie suivant une liste de préfixes codés en dur ; cette liste de préfixes est aussi utilisée pour placer un trait d'union sur les nombres en sortie. Comme de nouveaux préfixes sont ajoutés de temps en temps, la liste des préfixes pourrait devenir obsolète. Il est probable qu'une prochaine version de ce module utilisera une liste stockée sous la forme d'une ou plusieurs tables qui pourront être modifiées aisément par les utilisateurs quand cela se révélera nécessaire. Néanmoins, actuellement, la liste est modifiable uniquement par changement du code source et recompilation. Il est aussi possible que la validation du préfixe et le support des traits d'union soient supprimés de ce module dans une version future.

Ce module est considéré comme « trusted », ce qui signifie qu'il peut être installé par des utilisateurs simples (sans attribut `SUPERUSER`) et qui ont l'attribut `CREATE` sur la base de données courante.

### F.21.1. Types de données

Tableau F.11 affiche les types de données fournis par le module `isn`.

Tableau F.11. Types de données `isn`

Type de données | Description
--- | ---
`EAN13` | Numéro d'article européen (European Article Numbers), toujours affiché dans le format de l'EAN13
`ISBN13` | Numéro standard international pour les livres (International Standard Book Numbers) à afficher dans le nouveau format EAN13
`ISMN13` | Numéro standard international pour la musique (International Standard Music Numbers) à afficher dans le nouveau format EAN13
`ISSN13` | Numéro de série au standard international (International Standard Serial Numbers) à afficher dans le nouveau format EAN13
`ISBN` | Numéro standard international pour les livres (International Standard Book Numbers) à afficher dans l'ancien format court
`ISMN` | Numéro standard international pour la musique (International Standard Music Numbers) à afficher dans l'ancien format court
`ISSN` | Numéro de série au standard international (International Standard Serial Numbers) à afficher dans l'ancien format court
`UPC` | Code produit universel (Universal Product Codes)

Quelques notes :

1. Les nombres ISBN13, ISMN13, ISSN13 sont tous des nombres EAN13.

2. Les nombres EAN13 ne sont pas toujours des ISBN13, ISMN13 ou ISSN13 (mais certains le sont).

3. Certains nombres ISBN13 peuvent être affichés comme des ISBN.

4. Certains nombres ISMN13 peuvent être affichés comme des ISMN.

5. Certains nombres ISSN13 peuvent être affichés comme des ISSN.

6. Les nombres UPC sont un sous-ensemble des nombres EAN13 (ce sont basiquement des EAN13 sans le premier `0`).

7. Tous les nombres UPC, ISBN, ISMN et ISSN numbers peuvent être représentés sous la forme EAN13.

En interne, tous ces types utilisent la même représentation (un entier sur 64 bits), et tous sont interchangeables. Plusieurs types sont fournis pour contrôler le formatage de l'affichage et pour permettre une vérification très fine de la validité des entrées qui est supposée dénoter un type particulier de nombre.

Les types `ISBN`, `ISMN` et `ISSN` afficheront la version courte du nombre (ISxN 10) quand c'est possible, et afficheront la version au format ISxN 13 pour les nombres qui ne tiennent pas dans la version courte. Les types `EAN13`, `ISBN13`, `ISMN13` et `ISSN13` afficheront toujours la version longue de l'ISxN (EAN13).

### F.21.2. Conversions

Le module `isn` fournit les paires suivantes pour les conversions de types :

- ISBN13 <=> EAN13

- ISMN13 <=> EAN13

- ISSN13 <=> EAN13

- ISBN <=> EAN13

- ISMN <=> EAN13

- ISSN <=> EAN13

- UPC <=> EAN13

- ISBN <=> ISBN13

- ISMN <=> ISMN13

- ISSN <=> ISSN13

Lors d'une conversion d'`EAN13` vers un autre type, il y a une vérification à l'exécution que la valeur est dans le domaine de l'autre type et une erreur est renvoyée dans le cas contraire. Les autres conversions sont simplement un renommage qui succèdera à chaque fois.

### F.21.3. Fonctions et opérateurs

Le module `isn` fournit des opérateurs de comparaison standard, plus un support des index B-Tree et hachés pour tous les types de données. De plus, il existe plusieurs fonctions spécialisées, listées dans Tableau F.12. Dans cette table, `isn` signifie un des types de données de ce module :

Tableau F.12. Fonctions de `isn`

`isn_weak` ( `boolean` ) → `boolean` Configure le mode de saisie faible et renvoie le nouveau paramétrage.
`isn_weak` () → `boolean` Renvoie le statut actuel du mode faible
`make_valid` ( `isn` ) → `isn` Valide un nombre invalide (efface le drapeau d'invalidité).
`is_valid` ( `isn` ) → `boolean` Vérifie la présence du drapeau d'invalidité

Le mode faible est utilisé pour insérer des données invalides dans une table. Invalide signifie que le chiffre de vérification est mauvais, pas qu'il manque des numéros.

Pourquoi voudriez-vous utiliser le mode faible ? Tout simplement parce que vous pouvez avoir une grosse collection de nombres ISBN, et que beaucoup d'entre eux, quelque soit la raison, ont un mauvais chiffre de vérification (peut-être que les nombres ont été scannés à partir d'une liste imprimée et que l'OCR s'est trompé sur les numéros, peut-être que les numéros ont été saisis manuellement... qui sait). Bref, le fait est que vous pouvez vouloir corriger ça, mais que vous voulez être capable d'avoir tous les nombres dans votre base de données pour que vous puissiez vérifier l'information et peut-être utiliser un outil externe pour localiser les nombres invalides dans la base de données, puis les vérifier et valider plus facilement ; donc par exemple, vous voudrez sélectionner tous les nombres invalides dans la table.

Quand vous insérez des nombres invalides dans une table en utilisant le mode faible, le nombre sera inséré avec le chiffre de vérification corrigé, mais il sera affiché avec un point d'exclamation (`!`) à la fin, par exemple `0-11-000322-5!`. Ce marqueur d'invalidité peut être vérifié avec la fonction `is_valid` et effacé avec la fonction `make_valid`.

Vous pouvez aussi forcer l'insertion de nombres invalides, même quand vous n'êtes pas dans le mode faible, en ajoutant le caractère `!` à la fin du nombre.

Une autre fonctionnalité spéciale est que, durant la saisie, vous pouvez écrire `?` à la place du chiffre de vérification. Ce dernier sera calculé et inséré automatiquement.

### F.21.4. Exemples

    --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.21.5. Bibliographie

Les informations qui ont permis l'implémentation de ce module ont été récupérées sur plusieurs sites, dont :

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

- https://www.issn.org/

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

- https://www.wikipedia.org/

Les préfixes utilisées pour le formatage ont été récupérés à partir de :

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

- https://en.wikipedia.org/wiki/List_of_ISBN_identifier_groups

- https://www.isbn-international.org/content/isbn-users-manual/29

- https://en.wikipedia.org/wiki/International_Standard_Music_Number

- https://www.ismn-international.org/ranges/tools

Nous avons porté une grande attention lors de la création des algorithmes et ils ont été vérifiés méticuleusement par rapport aux algorithmes suggérés dans les manuels utilisateurs officiels ISBN, ISMN et ISSN.

### F.21.6. Auteur

Germán Méndez Bravo (Kronuz), 2004–2006

Ce module est inspiré du code `isbn_issn` de Garrett A. Wollman.