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

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

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

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

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

F.22.1. Типы данных #

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

Таблица F.11. 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).

F.22.2. Приведения #

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

  • ISBN13 <=> EAN13

  • ISMN13 <=> EAN13

  • ISSN13 <=> EAN13

  • ISBN <=> EAN13

  • ISMN <=> EAN13

  • ISSN <=> EAN13

  • UPC <=> EAN13

  • ISBN <=> ISBN13

  • ISMN <=> ISMN13

  • ISSN <=> ISSN13

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

F.22.3. Функции и операторы #

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

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

Функция

Описание

isn_weak ( boolean ) → boolean

Устанавливает слабый режим ввода и возвращает новое значение.

isn_weak () → boolean

Возвращает текущий статус слабого режима.

make_valid ( isn ) → isn

Проверяет недопустимое число (снимает флаг недопустимости).

is_valid ( isn ) → boolean

Проверяет наличие флага недопустимости.


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

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

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

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

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

F.22.4. Примеры #

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

F.22.5. Библиография #

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

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

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

F.22.6. Автор #

Germán Méndez Bravo (Kronuz), 2004–2006

Этот модуль был вдохновлен кодом Гарретта А. Воллмана isbn_issn.