PostgreSQL 9.6.2 문서 | |||
---|---|---|---|
이전 | 위로 | 부록 F. 부가 확장 모듈들 | 다음 |
isn 모듈은 다음과 같은 제품의 국제 표준 번호를 처리하는 자료형을 제공한다: EAN13, UPC, ISBN (도서), ISMN (악보), ISSN (일련번호). 이 번호들의 유효성은 소스 코드에 선언된 접두사 목록에 따라 엄격하게 검사한다. 또한 이 목록은 자료 출력에서 하이픈으로 이어진 출력 양식을 결정하는 것에도 사용된다. 이 접두사 목록은 필요에 따라 계속 바뀌기 때문에, 소스 코드에 있는 목록에 최근 상황이 모두 반영되어 있지 않을 수도 있다. 이 모듈의 향후 버전은 이 접두사 목록을 하나 이상의 테이블로 보관하고, 사용자의 필요에 따라 그 목록을 편집할 수 있어야 보다 유연해 질 것이다. 하지만, 아직까지는 이 접두사 목록을 수정하려면, 소스 코드를 수정하고, 다시 컴파일 해서 사용해야 한다. 이런 두 작업이 진행 되지 않는다면, 결국 자료형 유효성 검사나, 하이픈 처리 기능은 이 모듈에서 빠져야 할 것이다.
표 F-12에서 isn 모듈에 포함된 자료형들을 설명한다.
표 F-12. isn 자료형들
자료형 | 설명 |
---|---|
EAN13 | 국제 상품 번호, 항상 EAN-13 형식으로 출력 |
ISBN13 | 국제 표준 도서 번호, 새 EAN-13 형식으로 출력 |
ISMN13 | 국제 표준 악보 번호, 새 EAN-13 형식으로 출력 |
ISSN13 | 국제 표준 일련 번호, 새 EAN-13 형식으로 출력 |
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 자료형은 출력이 가능하다면, 옛 10자리 짧은 형식으로 출력할 수 있고, 이렇게 출력할 수 없다면, 13자리 번호로 출력한다. EAN13, ISBN13, ISMN13, ISSN13 항상 긴 양식(EAN13)으로 출력한다.
isn 모듈은 아래와 같은 자료형 바꾸기를 지원한다.
ISBN13 <=> EAN13
ISMN13 <=> EAN13
ISSN13 <=> EAN13
ISBN <=> EAN13
ISMN <=> EAN13
ISSN <=> EAN13
UPC <=> EAN13
ISBN <=> ISBN13
ISMN <=> ISMN13
ISSN <=> ISSN13
EAN13 자료형을 다른 자료형으로 바꿀 때에는 바뀔 자료형 유효성 검사가 통과 될 때만 바뀐다. 그렇지 않을 때는 오류를 낸다. 그 외 다른 형변환은 단순하게 출력 형식 변경으로 항상 성공한다.
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 모드가 아닌 경우는 사용자가 강제로 자료값에 ! 문자를 추가해서 자료를 입력할 수도 있다.
또 다른 특별 기능으로 확인 숫자를 물음표(?)로 바꾸어 입력하면, 자동으로 그 자리 숫자를 계산해서 바른 숫자로 바꾸어 저장할 수 있다.
--문자열을 해당 자료형으로 변환 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;
각종 번호들에 대한 정보는 아래 사이트를 참조 했음:
유효성 검사와 하이픈 처리를 위한 소스에 포함된 접두사 목록은 다음 사이트를 참조 했음:
http://www.gs1.org/productssolutions/idkeys/support/prefix_list.html
https://www.isbn-international.org/content/isbn-users-manual
http://en.wikipedia.org/wiki/International_Standard_Music_Number
여기서 제공하는 유효성 검사, 하이픈 처리 알고리즘은 공식 ISBN, ISMN, ISSN 사용자 설명서에서 제시한 알고리즘보다 더 엄격하게 작성 되었다.
Germán Méndez Bravo (Kronuz), 2004 - 2006
이 모듈은 Garrett A. Wollman의 isbn_issn 코드에서 영감을 받았다.