F.20. isn — tipos de datos para números estándar internacionales (ISBN, EAN, UPC, etc.) #

F.20.1. Tipos de datos
F.20.2. Conversiones de tipos (Casts)
F.20.3. Funciones y operadores
F.20.4. Parámetros de configuración
F.20.5. Ejemplos
F.20.6. Bibliografía
F.20.7. Autor

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.

F.20.1. Tipos de datos #

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 datosDescripció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:

  1. Los números ISBN13, ISMN13 y ISSN13 son todos números EAN13.

  2. Los números EAN13 no siempre son ISBN13, ISMN13 o ISSN13 (algunos lo son).

  3. Algunos números ISBN13 se pueden mostrar como ISBN.

  4. Algunos números ISMN13 se pueden mostrar como ISMN.

  5. Algunos números ISSN13 se pueden mostrar como ISSN.

  6. Los números UPC son un subconjunto de los números EAN13 (básicamente son EAN13 sin el primer dígito 0).

  7. 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).

F.20.2. Conversiones de tipos (Casts) #

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.

F.20.3. Funciones y operadores #

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

Función

Descripción

make_valid ( isn ) → isn

Limpia la bandera de dígito de control no válido del valor.

is_valid ( isn ) → boolean

Comprueba la presencia de la bandera de dígito de control no válido.

isn_weak ( boolean ) → boolean

Establece el modo de entrada débil (weak input mode) y devuelve la nueva configuración. Esta función se conserva por compatibilidad hacia atrás. La forma recomendada de configurar el modo débil es a través del parámetro de configuración isn.weak.

isn_weak () → boolean

Devuelve el estado actual del modo débil. Esta función se conserva por compatibilidad hacia atrás. La forma recomendada de verificar el modo débil es a través del parámetro de configuración isn.weak.


F.20.4. Parámetros de configuración #

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.

F.20.5. Ejemplos #

-- 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;

F.20.6. Bibliografía #

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.

F.20.7. Autor #

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

Este módulo se inspiró en el código isbn_issn de Garrett A. Wollman.