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

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:

ФункцияОписание
make_valid ( isn ) → isnСбрасывает флаг неверной контрольной цифры
is_valid ( isn ) → booleanПроверяет наличие недопустимого флага
isn_weak ( boolean ) → booleanУстанавливает режим слабого ввода и возвращает новое значение. Эта функция сохранена для обратной совместимости. Рекомендуемый способ установки режима слабого ввода — использование параметра конфигурации isn.weak
isn_weak () → booleanВозвращает текущее состояние слабого режима. Эта функция сохранена для обратной совместимости. Рекомендуемый способ проверки слабого режима — использование параметра конфигурации isn.weak

Параметры конфигурации

isn.weak (логическое значение)

isn.weak включает режим слабого ввода, который позволяет принимать значения ISBN, даже если их контрольная цифра неверна. Значение по умолчанию — false, что означает отклонение неверных контрольных цифр.

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

При вставке недопустимых чисел в таблицу в режиме «слабого ввода» число будет вставлено с исправленной контрольной цифрой, но в конце будет отображаться восклицательный знак (!), например, 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:
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;

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

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

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

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