El módulo isn proporciona tipos de datos para los siguientes
estándares internacionales de numeración de productos: EAN13, UPC, ISBN (libros), ISMN
(música) y ISSN (publicaciones periódicas). Los números se validan al ingresarse de
acuerdo con una lista estática de prefijos; esta lista de prefijos también se utiliza para
separar los números con guiones en la salida. Dado que de vez en cuando se asignan
nuevos prefijos, la lista de prefijos puede estar desactualizada. Se espera que una versión
futura de este módulo obtenga la lista de prefijos a partir de una o más tablas que los
usuarios puedan actualizar fácilmente según sea necesario; sin embargo, en la actualidad, la
lista solo se puede actualizar modificando el código fuente y volviendo a compilar.
Alternativamente, el soporte para la validación de prefijos y la separación con guiones podría
eliminarse en una versión futura de este módulo.
Este módulo se considera «confiable» (trusted), es decir, puede ser
instalado por no superusuarios que tengan el privilegio CREATE
en la base de datos actual.
La Table F.10 muestra los tipos de datos proporcionados por
el módulo isn.
Table F.10. Tipos de datos de isn
| Tipo de datos | Descripción |
|---|---|
EAN13 | European Article Numbers (EAN), siempre mostrados en el formato de visualización EAN13 |
ISBN13 | International Standard Book Numbers (ISBN) a mostrar en el nuevo formato de visualización EAN13 |
ISMN13 | International Standard Music Numbers (ISMN) a mostrar en el nuevo formato de visualización EAN13 |
ISSN13 | International Standard Serial Numbers (ISSN) a mostrar en el nuevo formato de visualización EAN13 |
ISBN | International Standard Book Numbers a mostrar en el antiguo formato corto de visualización |
ISMN | International Standard Music Numbers a mostrar en el antiguo formato corto de visualización |
ISSN | International Standard Serial Numbers a mostrar en el antiguo formato corto de visualización |
UPC | Universal Product Codes (UPC) |
Algunas notas:
Los números ISBN13, ISMN13 y ISSN13 son todos números EAN13.
Los números EAN13 no siempre son ISBN13, ISMN13 o ISSN13 (algunos lo son).
Algunos números ISBN13 se pueden mostrar como ISBN.
Algunos números ISMN13 se pueden mostrar como ISMN.
Algunos números ISSN13 se pueden mostrar como ISSN.
Los números UPC son un subconjunto de los números EAN13 (básicamente son EAN13 sin el primer dígito 0).
Todos los números UPC, ISBN, ISMN e ISSN se pueden representar como números EAN13.
Internamente, todos estos tipos utilizan la misma representación (un entero de 64 bits) y todos son intercambiables. Se proporcionan múltiples tipos para controlar el formato de visualización y permitir una verificación de validez más estricta de los datos de entrada que se supone deben denotar un tipo particular de número.
Los tipos ISBN, ISMN e ISSN mostrarán la versión
corta del número (ISxN 10) siempre que sea posible, y mostrarán el formato ISxN 13 para
los números que no quepan en la versión corta. Los tipos EAN13, ISBN13,
ISMN13 y ISSN13 siempre mostrarán la versión larga del ISxN (EAN13).
El módulo isn proporciona los siguientes pares de conversiones de tipos:
ISBN13 <=> EAN13
ISMN13 <=> EAN13
ISSN13 <=> EAN13
ISBN <=> EAN13
ISMN <=> EAN13
ISSN <=> EAN13
UPC <=> EAN13
ISBN <=> ISBN13
ISMN <=> ISMN13
ISSN <=> ISSN13
Al realizar una conversión de EAN13 a otro tipo, hay una verificación en
tiempo de ejecución de que el valor se encuentra dentro del dominio del otro tipo, y se
lanza un error si no es así. Las otras conversiones son simplemente cambios de etiqueta
que siempre tendrán éxito.
El módulo isn proporciona los operadores de comparación estándar,
además de soporte para indexación B-tree y hash para todos estos tipos de datos.
Además, existen varias funciones especializadas, que se muestran en la Table F.11.
En esta tabla, isn representa cualquiera de los tipos de datos del módulo.
Table F.11. Funciones de isn
isn.weak (boolean)
#
isn.weak habilita el modo de entrada débil, lo que permite
aceptar valores de entrada ISN incluso cuando su dígito de control sea incorrecto.
El valor predeterminado es false, el cual rechaza los dígitos
de control no válidos.
¿Por qué querrías usar el modo débil? Bueno, podría ser que tengas una gran colección de números ISBN y que haya tantos que, por razones extrañas, algunos tengan el dígito de control incorrecto (tal vez los números se escanearon de una lista impresa y el OCR se equivocó con los números, tal vez los números se capturaron manualmente... quién sabe). De todos modos, el punto es que podrías querer limpiar ese desorden, pero aun así quieres poder tener todos los números en tu base de datos y tal vez usar una herramienta externa para ubicar los números no válidos en la base de datos para poder verificar la información y validarla más fácilmente; por ejemplo, querrías seleccionar todos los números no válidos en la tabla.
Cuando insertas números no válidos en una tabla utilizando el modo débil, el número
se insertará con el dígito de control corregido, pero se mostrará con un signo de
exclamación (!) al final, por ejemplo 0-11-000322-5!.
Esta marca de invalidez se puede comprobar con la función is_valid
y limpiar con la función make_valid.
También puedes forzar la inserción de números marcados como no válidos incluso cuando
no estés en modo débil, agregando el carácter ! al final del número.
Otra característica especial es que, durante la entrada, puedes escribir
? en lugar del dígito de control, y el dígito de control
correcto se insertará automáticamente.
-- Usando los tipos directamente:
SELECT isbn('978-0-393-04002-9');
SELECT isbn13('0901690546');
SELECT issn('1436-4522');
-- Conversiones de tipos (Casts):
-- ten en cuenta que solo puedes convertir de ean13 a otro tipo cuando el
-- número sea válido en el ámbito del tipo de destino;
-- por lo tanto, lo siguiente NO funcionará: select isbn(ean13('0220356483481'));
-- pero esto sí:
SELECT upc(ean13('0220356483481'));
SELECT ean13(upc('220356483481'));
-- Crear una tabla con una sola columna para almacenar números ISBN:
CREATE TABLE test (id isbn);
INSERT INTO test VALUES('9780393040029');
-- Calcular automáticamente los dígitos de control (observa el '?'):
INSERT INTO test VALUES('220500896?');
INSERT INTO test VALUES('978055215372?');
SELECT issn('3251231?');
SELECT ismn('979047213542?');
-- Usando el modo débil:
SET isn.weak TO true;
INSERT INTO test VALUES('978-0-11-000533-4');
INSERT INTO test VALUES('9780141219307');
INSERT INTO test VALUES('2-205-00876-X');
SET isn.weak TO 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;
La información para implementar este módulo fue recopilada de varios sitios, incluyendo:
Los prefijos utilizados para la separación con guiones también se compilaron de:
Se tuvo cuidado durante la creación de los algoritmos y se verificaron meticulosamente contra los algoritmos sugeridos en los manuales de usuario oficiales de ISBN, ISMN y ISSN.
Germán Méndez Bravo (Kronuz), 2004–2006
Este módulo se inspiró en el código isbn_issn de Garrett A. Wollman.