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.
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 :
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.12. Dans cette table, isn
signifie un des types de données de ce module :
Tableau F.12. Fonctions de isn
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.