新着記事

Viewing posts by 工藤淳

10年に一度巡る雑誌コードの話

ISBNコード(書籍JANコード)とともに本に付番されている雑誌コードについて解説します。
雑誌コードからJANコードを作成しなければならない時に役に立つ知識です。

雑誌コードとは

雑誌扱いの本に付番されている5桁+4桁、または5桁+2桁のコードです。
この5桁に意味がずっしりと詰まっています。
また、バーコードはISBNコード(書籍JANコード)と一般商品JANコードのものがあります。
雑誌コードの始まる1桁目で雑誌コードの種類がきまります。

1. 1桁目が01は月刊誌(隔月刊や季刊の雑誌も含む)

基本、末尾は奇数。別冊や増刊号は末尾の数に+1して偶数になる。
本に印刷されるバーコードは一般商品JANコード

例)雑誌コード5桁+「-」+月2桁+年の下2桁

月刊TORICO 8月号
01234-0821、または省略して01234-08
月刊TORICO 8月増刊号
01235-0821、または省略して01235-08

2. 1桁目が23は週刊誌(隔週刊や月2回発売の雑誌も含む)

末尾は発売した週で1〜5。
別冊や増刊号は末尾に6以上の数が振られる。
本に印刷されるバーコードは一般商品JANコード

例)雑誌コード5桁+「-」+月2桁+年の下2桁

週刊TORICO 8/6号(8月1週目)
21231-0821、または21231-8/6
週刊TORICO 8/13号(8月2週目)
21232-0821、または21232-8/13
週刊TORICO 8/20号(8月3週目)
21233-0821、または21233-8/20
週刊TORICO 8/20増刊号
21236-0821、または21236-8/20

3. 1桁目が45は漫画のコミックス

雑誌コード5桁は固定。
だいたいレーベルごとになっている(〇〇コミック)
月年はなく雑誌コードに対して発売された巻数の通巻数2桁。
本に印刷されるバーコードは書籍JANコード

例)雑誌コード5桁+「-」+通巻数2桁

TORICOコミックス 1巻
41234-01
TORICOコミックス 2巻
41234-02

4. 1桁目が6はムック

雑誌コード5桁は固定。
だいたいレーベルごとになっている(〇〇ムック)
月年はなく雑誌コードに対して発売された巻数の通巻数2桁。
本に印刷されるバーコードは書籍JANコード

例)雑誌コード5桁+「-」+通巻数2桁

TORICOムック よくわかるTORICO
61234-01
TORICOムック TORICO大全
61234-02

5. 珍しいコード

1桁目が7で始まる、オーディオ・ビジュアル商品
1桁目が8で始まる、直販誌
1桁目が9で始まる、PB商品

雑誌コードから一般商品JANコードの作成方法

月刊誌、週刊誌にはISBNコード(書籍JANコード)がありません。
雑誌コードのみ付番されています。
ではバーコードは何でできているか?というと雑誌コードから一般商品JANコードを作成することができます。

例)01234-0821の場合
一般商品JANコードは4910012340819となります。
内訳としては
491=>定期刊行物コードのプレフィックス。固定
0=>予備。雑誌コードが満数になった場合使うかもしれない
01234=>雑誌コード5桁
08=>月号2桁
1=>年の下1桁
9=>JANのチェックデジット。形式はモジュラス10、ウエイト1、3
これをphpで書くと下記の様になります

/**
 * 雑誌コードをJANコードに変換する
 * @param string $code 雑誌コード、5桁-4桁
 * @return string JANコード
 */
function magazineCode2Jan($code)
{
    // 雑誌コードと月号で分ける
    $exp_code = explode('-', $code);
    $magazine_code = $exp_code[0];
    // 年の下1桁
    $year = substr($exp_code[1], 3, 1);
    $month = substr($exp_code[1], 0, 2);
    $prefix = 491;
    $spare = 0;
    $jan12 = $prefix . $spare . $magazine_code . $month . $year;
    // チェックデジット計算
    $chkdgt = getCheckDigit13($jan12);
    $jan13 = $jan12 . $chkdgt;
    return $jan13;
}

※チェックデジットの計算はエンジニアの知らないISBNの話のコード例にある「ISBN13桁のチェックディジット」を使用しています。
ここでタイトル回収になるのですが、年の下1桁を使用するため雑誌コードは10年に一度同じコードになります。
データベースにカラムを作る際はユニーク制約をしない、あるいは絶版になった雑誌を定期的に削除するような仕組みが必要になります。

エンジニアの知らないISBNの話

本には商品判別のためのバーコードがついています。
いわゆるISBNコード(JANコード)です。
ECショップでは本を取り扱うために本の書誌を記録するテーブルを作成しますが、その際にint型でいいだろう? ユニーク制約でいいか?とおもってはいけないません。

先に結論を書いてしまうと

  • 文字が含まれる可能性がある
  • 先頭に0が来る可能性がある
  • ユニークではない

char型にして、ユニーク制約をつけないほうがよい理由

1. 文字「X」が含まれる可能性がある

ISBNコードには10桁と13桁があります。
10桁ISBNコードは9桁+チェックデジット1桁で構成されます。
古い体系ですが、一部で使うことがあり、チェックデジットに文字「X」がはいる可能性があります。
これはチェックデジットがモジュラス11、ウェイト10-2という方法で算出されるためです。
計算方法をphpで書くと

/**
 * ISBN10桁のチェックディジットを返す
 */
function getCheckDigit10($jan9)
{
    $sum = 0;
    $cnt = 0;
    for ($i = 10; ; $i--) {
        if ($cnt > 10) {
            break;
        }
        $sum += substr($jan9, $cnt, 1) * $i;
        $cnt++;
    }
    $remainder = $sum % 11;
    if ($remainder == 0) {
        return 0;
    }
    $check_digit = 11 - $remainder;
    if ($check_digit == 10) {
        $check_digit = 'X';
    }
    return $check_digit;
}

2. 先頭に0がつく可能性がある

ISBNコードと書きましたが、実際にバーコードになっているのはJANコードです。
そしてJANコードは先頭が「0」になる可能性があります。
本を売るショップとして取り扱いそうなJANコードは3種類。

  1. 一般商品JANコード
    45,または49で始まる12桁+チェックデジット1桁の13桁JANコード。
    45と49は日本に割り振られた国コードなので固定。
    雑誌やグッズなどに使われています。
  2. 書籍JANコード
    9784で始まる12桁+チェックデジット1桁の13桁JANコード。
    978は世界共通の書籍コード
    4は日本に割り振られた国コードなので固定。
    いわゆる13桁ISBNコード。
    コミックや書籍などに使われています。
    バーコードは2段になっており、上段は書籍JANコード、分類・価格のコード。
  3. インストアコード
    02、04、20〜29で始まる12桁+チェックデジット1桁の13桁JANコード。
    ポイントカード、会員証やレジ袋などの管理・販売用に使われる、小売店が独自につくって使用してよいJANコード。
    20〜29始まりのJANコードを使用すればいい話だが、02、04も準備しておくに越したことはない。

JANコードのチェックデジットはモジュラス10、ウエイト3-1という方法で算出されるため0〜9の数字になります。

/**
 * ISBN13桁のチェックディジットを返す
 */
function getCheckDigit13($jan12)
{
    $sum_odd = 0;
    $sum_even = 0;
    for ($i = 11; $i >= 0; $i--) {
        if ($i % 2) {
            $sum_odd += substr($jan12, $i, 1);
        } else {
            $sum_even += substr($jan12, $i, 1);
        }
    }
    $sum = $sum_odd * 3 + $sum_even;
    $division = $sum % 10;
    return (10 - $division) % 10;
}

3. 同じJANコードが使われる

JANコードは同じコードが存在するのでユニークではありません。

  1. 書籍JANコードの場合
    「今現在販売中の本」と限定すれば書籍JANコードはユニークになります。
    ただし、本が絶版になったあと、そのJANコードは別の本に付番されます。
    そのため、今までに発売したすべての本のJANコードだと同じJANコードをもつ本が複数存在します。
  2. 雑誌の一般商品JANコードの場合
    雑誌に付番されている雑誌コードから一般商品JANコードが作成されます。
    その際に西暦の下1桁を使用しているため、10年ごとに同じコードになります。

以上がISBNコード(JANコード)をint型、ユニーク制約にしては行けない理由でした。
10桁と13桁のどちらも記録できるようにしてあると便利かもしれません。

Search