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 | Универсальные коды продуктов |
Некоторые заметки:
- Номера ISBN13, ISMN13 и ISSN13 являются номерами EAN13.
- Числа EAN13 не всегда являются ISBN13, ISMN13 или ISSN13 (некоторые из них).
- Некоторые номера ISBN13 могут отображаться как ISBN.
- Некоторые номера ISMN13 могут отображаться как ISMN.
- Некоторые номера ISSN13 могут отображаться как ISSN.
- Номера UPC являются подмножеством номеров EAN13 (по сути, это EAN13 без первой
0цифры). - Все номера 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;
Библиография
Информация для реализации этого модуля была собрана с нескольких сайтов, включая:
- https://www.isbn-international.org/;
- https://www.issn.org/;
- https://www.ismn-international.org/;
- https://www.wikipedia.org/.
Префиксы, используемые для дефисов, были также собраны из:
- https://www.gs1.org/standards/id-keys;
- https://en.wikipedia.org/wiki/List_of_ISBN_registration_groups;
- https://www.isbn-international.org/content/руководство-пользователя-isbn;
- https://ru.wikipedia.org/wiki/Международный_стандартный_номер_музыкального_произведения;
- https://www.ismn-international.org/ranges.html.
При создании алгоритмов были приняты все меры предосторожности, и они тщательно проверены на соответствие рекомендуемым алгоритмам в официальных руководствах пользователя ISBN, ISMN, ISSN.