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:
Функция | Описание |
---|---|
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;
Библиография
Информация для реализации этого модуля была собрана с нескольких сайтов, включая:
- 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://ru.wikipedia.org/wiki/Список_групповых_идентификаторов_ISBN;
- https://www.isbn-international.org/content/руководство-пользователя-isbn;
- https://ru.wikipedia.org/wiki/Международный_стандартный_номер_музыкального_произведения;
- https://www.ismn-international.org/ranges.html.
При создании алгоритмов были приняты все меры предосторожности, и они тщательно проверены на соответствие рекомендуемым алгоритмам в официальных руководствах пользователя ISBN, ISMN, ISSN.