Перейти к основному содержимому

isn — типы данных для международных стандартов нумерации (ISBN, EAN, UPC и др.)

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

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

Типы данных

Таблица «Типы данных isn» показывает типы данных, предоставляемые модулем isn.

Типы данных isn:

Тип данныхОписание
EAN13Европейские артикулы товаров всегда отображаются в формате EAN13
ISBN13Международные стандартные книжные номера должны быть представлены в новом формате отображения EAN13
ISMN13Международные стандартные музыкальные номера должны быть представлены в новом формате отображения EAN13
ISSN13Международные стандартные серийные номера должны отображаться в новом формате отображения EAN13
ISBNМеждународные стандартные книжные номера должны отображаться в старом коротком формате отображения
ISMNМеждународные стандартные музыкальные номера должны отображаться в старом коротком формате отображения
ISSNМеждународные стандартные серийные номера должны отображаться в старом коротком формате отображения
UPCУниверсальные коды продуктов

Некоторые заметки:

  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.

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

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

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

Функции 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.

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

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

Примеры

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

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

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

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

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