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.
Tableau F.10, « Types de données isn » shows the data types provided by the isn module.
Tableau F.10. 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 :
Les nombres ISBN13, ISMN13, ISSN13 sont tous des nombres EAN13.
Les nombres EAN13 ne sont pas toujours des ISBN13, ISMN13 ou ISSN13 (mais certains le sont).
Certains nombres ISBN13 peuvent être affichés comme des ISBN.
Certains nombres ISMN13 peuvent être affichés comme des ISMN.
Certains nombres ISSN13 peuvent être affichés comme des ISSN.
Les nombres UPC sont un sous-ensemble des nombres EAN13 (ce sont basiquement des EAN13 sans le premier 0).
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).
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.
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.11, « Fonctions de isn ». Dans cette table, isn signifie un des types de données de ce module :
Tableau F.11. Fonctions de isn
Fonction | Retour | Description |
---|---|---|
isn_weak(boolean) | boolean | Configure le mode de saisie faible (renvoie le nouveau paramétrage) |
isn_weak() | boolean | Récupère 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.
--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;
Les informations qui ont permis l'implémentation de ce module ont été récupérées sur plusieurs sites, dont :
Les préfixes utilisées pour le formatage ont été récupérés à partir de :
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.
Germán Méndez Bravo (Kronuz), 2004 - 2006
Ce module est inspiré du code isbn_issn de Garrett A. Wollman.