F.19. isn

isn 모듈은 다음과 같은 제품의 국제 표준 번호를 처리하는 자료형을 제공한다: EAN13, UPC, ISBN (도서), ISMN (악보), ISSN (일련번호). 이 번호들의 유효성은 소스 코드에 선언된 접두사 목록에 따라 엄격하게 검사한다. 또한 이 목록은 자료 출력에서 하이픈으로 이어진 출력 양식을 결정하는 것에도 사용된다. 이 접두사 목록은 필요에 따라 계속 바뀌기 때문에, 소스 코드에 있는 목록에 최근 상황이 모두 반영되어 있지 않을 수도 있다. 이 모듈의 향후 버전은 이 접두사 목록을 하나 이상의 테이블로 보관하고, 사용자의 필요에 따라 그 목록을 편집할 수 있어야 보다 유연해 질 것이다. 하지만, 아직까지는 이 접두사 목록을 수정하려면, 소스 코드를 수정하고, 다시 컴파일 해서 사용해야 한다. 이런 두 작업이 진행 되지 않는다면, 결국 자료형 유효성 검사나, 하이픈 처리 기능은 이 모듈에서 빠져야 할 것이다.

F.19.1. 자료형

표 F-12에서 isn 모듈에 포함된 자료형들을 설명한다.

표 F-12. isn 자료형들

자료형설명
EAN13 국제 상품 번호, 항상 EAN-13 형식으로 출력
ISBN13 국제 표준 도서 번호, 새 EAN-13 형식으로 출력
ISMN13 국제 표준 악보 번호, 새 EAN-13 형식으로 출력
ISSN13 국제 표준 일련 번호, 새 EAN-13 형식으로 출력
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 자료형은 출력이 가능하다면, 옛 10자리 짧은 형식으로 출력할 수 있고, 이렇게 출력할 수 없다면, 13자리 번호로 출력한다. EAN13, ISBN13, ISMN13, ISSN13 항상 긴 양식(EAN13)으로 출력한다.

F.19.2. 자료형 변환

isn 모듈은 아래와 같은 자료형 바꾸기를 지원한다.

EAN13 자료형을 다른 자료형으로 바꿀 때에는 바뀔 자료형 유효성 검사가 통과 될 때만 바뀐다. 그렇지 않을 때는 오류를 낸다. 그 외 다른 형변환은 단순하게 출력 형식 변경으로 항상 성공한다.

F.19.3. 함수와 연산자들

isn 모듈은 지원하는 자료형에 대해서, 표준 비교 연산자와 B-트리, 해시 인덱스를 지원한다. 추가로, 아래 함수들은 해당 자료형을 사용할 때 특별하게 사용할 수 있다. 표 F-13 참조. 아래 isn으로 표현한 자료형은 이 모듈에서 제공하는 모든 자료형을 뜻한다.

표 F-13. isn 함수들

함수반환자료형설명
isn_weak(boolean)boolean입력에서 유효성 검사의 엄격함을 지정함 (반환값은 새로 지정된 값)
isn_weak()boolean현재 유효성 검사의 엄격함을 보여줌
make_valid(isn)isn잘못된 플래그가 있는 입력값을 바른 값으로 바꿈
is_valid(isn)boolean잘못된 플래그가 있는 입력값을 바르게 바꿀 수 있는지 검사함

weak 모드는 잘못된 자료를 테이블에 입력할 때, 그 자료에 대한 유효성 검사 방법을 말한다. 잘못된 자료란 해당 번호의 자릿수는 맞는데, 그 번호의 마지막 숫자인 유효성 확인 숫자가 올바르지 않은 것을 뜻한다.

weak 모드가 전환이 필요한 이유는, ISBN 번호에서 전집류인 경우, 꽤 많은 책들이 같은 ISBN 번호를 사용하면서, 이 유효성 확인 숫자를 바르게 사용하지 않기 때문이다. (어쩌면 바코드 스캔 값과 제품에 인쇄된 번호가 서로 틀린 경우도 있을 것이다.) 어째든, 이런 자료들에 대해서도 융통성 있게 자료를 대량 입력해야 할 경우, 매번 그 번호들에 대해서 엄격하게 그 유효성을 검사할 수도 없는 노릇이다. 일단 자료를 입력하고 그 자료를 보정하는 방법은 아래 예제에서 소개한다.

weak 모드에서 테이블로 자료를 입력할 때, 잘못된 확인 숫자는 바르게 변경되어 저장되지만, 그 값을 출력하면, 끝에 느낌표(!)가 붙는다. 예, 0-11-000322-5!. 이 잘못된 자료는 is_valid 함수로 확인 할 수 있고, make_valid 함수로 바르게 정리할 수 있다.

weak 모드가 아닌 경우는 사용자가 강제로 자료값에 ! 문자를 추가해서 자료를 입력할 수도 있다.

또 다른 특별 기능으로 확인 숫자를 물음표(?)로 바꾸어 입력하면, 자동으로 그 자리 숫자를 계산해서 바른 숫자로 바꾸어 저장할 수 있다.

F.19.4. 예제

--문자열을 해당 자료형으로 변환
SELECT isbn('978-0-393-04002-9');
SELECT isbn13('0901690546');
SELECT issn('1436-4522');

--자료형 변환:
-- 앞에서 설명한 것처럼 EAN-13 번호를 다른 번호로 바꿀 때
-- 바뀔 번호 양식에 맞아야 변환된다.
-- select isbn(ean13('0220356483481')); 이 쿼리는 실패한다.
-- 하지만 다음 쿼리는 성공 한다.
SELECT upc(ean13('0220356483481'));
SELECT ean13(upc('220356483481'));

--ISBN 번호를 저장하는 테이블을 만들고, 자료 입력
CREATE TABLE test (id isbn);
INSERT INTO test VALUES('9780393040029');

--유효성 검사 번호는 ? 문자를 이용해 자동 처리할 수 있다
INSERT INTO test VALUES('220500896?');
INSERT INTO test VALUES('978055215372?');

SELECT issn('3251231?');
SELECT ismn('979047213542?');

--덜 엄격한 검사와 엄격한 검사 전환
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.19.5. 참고 문헌

각종 번호들에 대한 정보는 아래 사이트를 참조 했음:

유효성 검사와 하이픈 처리를 위한 소스에 포함된 접두사 목록은 다음 사이트를 참조 했음:

여기서 제공하는 유효성 검사, 하이픈 처리 알고리즘은 공식 ISBN, ISMN, ISSN 사용자 설명서에서 제시한 알고리즘보다 더 엄격하게 작성 되었다.

F.19.6. 만든 이

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

이 모듈은 Garrett A. Wollman의 isbn_issn 코드에서 영감을 받았다.