isn

Модуль isn предоставляет типы данных для следующих международных стандартов нумерации товаров: EAN13, UPC, ISBN (книги), ISMN (музыка) и ISSN (серийные номера). Номера проверяются на входе согласно жестко закодированному списку префиксов; этот список префиксов также используется для разбивки (при помощи дефиса) номеров при выводе. Поскольку время от времени появляются новые префиксы, этот список префиксов может устаревать. Ожидается, что будущая версия этого модуля будет получать список префиксов из одной или нескольких таблиц, которые при необходимости смогут легко обновлять пользователи; однако в настоящее время этот список можно обновить, только модифицировав и перекомпилировав исходный код. Также есть вероятность, что из будущей версии этого модуля будет удалена возможность проверки префиксов и поддержка разбивки номеров.

Этот модуль считается «доверенным», то есть его могут устанавливать обычные пользователи с правом CREATE в текущей базе данных.


Типы данных

В Таблице 11 перечислены типы данных, предоставляемые модулем isn.

Таблица 11. Типы данных isn

Тип данныхОписание
EAN13Европейский номер товара (European Article Number), всегда отображается в формате EAN13
ISBN13Международный стандартный книжный номер (International Standard Book Number), отображаемый в новом формате EAN13
ISMN13Международный стандартный музыкальный номер (International Standard Music Number), отображаемый в новом формате EAN13
ISSN13Международный стандартный серийный номер (International Standard Serial Number), отображаемый в новом формате EAN13
ISBNМеждународный стандартный книжный номер, отображаемый в старом коротком формате
ISMNМеждународный стандартный музыкальный номер, отображаемый в старом коротком формате
ISSNМеждународный стандартный серийный номер, отображаемый в старом коротком формате
UPCУниверсальный код товара (Universal Product Code)

Несколько примечаний:

  1. Номера ISBN13, ISMN13, ISSN13 являются номерами EAN13.

  2. Не все номера EAN13 (только некоторые) представляют ISBN13, ISMN13 или ISSN13.

  3. Некоторые номера ISBN13 можно отобразить в формате ISBN.

  4. Некоторые номера ISMN13 можно отобразить в формате ISMN.

  5. Некоторые номера ISSN13 можно отобразить в формате ISSN.

  6. Номера UPC являются подмножеством номеров EAN13 (по сути они являются номерами EAN13 без первой цифры 0).

  7. Все номера UPC, ISBN, ISMN и ISSN можно представить как номера EAN13.

Внутри все эти типы используют одинаковое представление (64-битное целое число), и все они взаимозаменяемы. Различные типы предоставляются для управления форматированием при выводе и для более строгой проверки правильности ввода, что и должно определять конкретный тип номера.

Типы ISBN, ISMN и ISSN отображают короткую версию номера (ISxN 10), когда это возможно, и выбирают формат ISxN 13 для номеров, не умещающихся в короткую версию. Типы EAN13, ISBN13, ISMN13 и ISSN13 всегда отображают длинную версию ISxN (EAN13).


Приведения

Модуль isn предоставляет следующие пары приведений типов:

  • ISBN13 <=> EAN13

  • ISMN13 <=> EAN13

  • ISSN13 <=> EAN13

  • ISBN <=> EAN13

  • ISMN <=> EAN13

  • ISSN <=> EAN13

  • UPC <=> EAN13

  • ISBN <=> ISBN13

  • ISMN <=> ISMN13

  • ISSN <=> ISSN13

При приведении EAN13 к другому типу проводится проверка времени выполнения, соответствует ли это значение целевому типу, и если это не так, выдается ошибка. При других приведениях значения просто перемечаются, поэтому они всегда выполняются успешно.


Функции и операторы

Модуль Функции предоставляет стандартные операторы сравнения плюс поддержку индексов по хэшу и B-деревьев для всех этих типов данных. Кроме того, он реализует несколько специализированных функций, перечисленных в Таблице 12. В этой таблице isn обозначает один из типов данных модуля.

Таблица 12. Функции isn

Функция
Описание
isn_weak ( boolean ) → boolean
Устанавливает ослабленный режим проверки ввода и возвращает новую настройку.
isn_weak () → boolean
Возвращает текущее состояние ослабленного режима.
make_valid ( isn ) → isn
Валидирует неверный номер (сбрасывает флаг ошибки).
is_valid ( isn ) → boolean
Проверяет присутствие флага ошибки.

Установка ослабленного режима позволяет вставлять в таблицу неверные данные. Под неверными данными подразумеваются номера, в которых не сходится проверочная цифра, а не то, что номера отсутствуют.

Зачем может понадобиться ослабленный режим? Ну, может случиться так, что у вас есть большой набор номеров ISBN, и очень многие из них по каким-то странным причинам содержат неверную контрольную цифру (возможно, эти номера были отсканированы с печатного листа и были неправильно распознаны, возможно, они вводились вручную... кто знает). В любом случае, смысл в том, что вы хотите с этим разобраться, но вам все равно нужно загрузить все эти номера в вашу базу данных и, может быть, использовать дополнительный инструмент для поиска неверных номеров в базе данных, чтобы было проще проверить и исправить информацию; так что, например, вам нужно будет выбрать все неверные номера в таблице.

Если вставить в таблице неверные номер в ослабленном режиме, этот номер будет вставлен с исправленной проверочной цифрой, но отобразится с восклицательным знаком (!) в конце, например 0-11-000322-5!. Этот маркер ошибки можно проверить с помощью функции is_valid и очистить функцией make_valid.

Также можно принудительно вставить неверные номера даже не в ослабленном режиме, добавив символ ! в конце номера.

Есть еще одна специальная возможность — во время ввода вместо проверочной цифры можно написать ?, и правильная проверочная цифра будет вставлена автоматически.


Примеры

--Использование типов напрямую:
SELECT isbn('978-0-393-04002-9');
SELECT isbn13('0901690546');
SELECT issn('1436-4522');

--Приведение типов:
-- обратите внимание, что номер ean13 можно привести к другому типу, только когда
-- этот номер будет верным по меркам целевого типа;
-- таким образом, это: select isbn(ean13('0220356483481')); — НЕ будет работать,
-- а это будет:
SELECT upc(ean13('0220356483481'));
SELECT ean13(upc('220356483481'));

--Создание таблицы с одним столбцом, который будет содержать номера ISBN:
CREATE TABLE test (id isbn);
INSERT INTO test VALUES('9780393040029');

--Автоматическое вычисление проверочных цифр (обратите внимание на '?'):
INSERT INTO test VALUES('220500896?');
INSERT INTO test VALUES('978055215372?');

SELECT issn('3251231?');
SELECT ismn('979047213542?');

--Использование ослабленного режима:
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;

Библиография

Информация, на основе которой реализован этот модуль, была собрана с нескольких сайтов, включая:

Префиксы, используемые для разбивки номеров, были также собраны с:

Алгоритмы были созданы со всей тщательностью и были скрупулезно сверены с алгоритмами, предлагаемыми в официальных руководствах ISBN, ISMN и ISSN.


Автор

Герман Мендез Браво (Germán Méndez Bravo) (Kronuz), 2004–2006

Этот модуль был написан под влиянием кода isbn_issn Гаррета А. Уоллмена (Garrett A. Wollman).