バーコードのデータベース設計
バーコードの値をシステムで扱うとき、生成そのものよりデータの持ち方で問題が起きます。ここでは実装時に繰り返し発生する落とし穴を整理します。
1. 桁数を正規化する
最大の問題が桁数の混在です。同じ商品が複数の桁数で表現されます。
| 形式 | 桁数 | 関係 |
|---|---|---|
| UPC-E | 8桁 | UPC-Aの短縮形 |
| GTIN-8(JAN短縮) | 8桁 | 独立した体系 |
| UPC-A(GTIN-12) | 12桁 | 先頭に0を足すとGTIN-13 |
| EAN-13(GTIN-13) | 13桁 | 日本のJANコード |
| ITF-14(GTIN-14) | 14桁 | 集合包装 |
スキャナーの設定によって、同じ商品が8桁で送られたり12桁で送られたりします。データベース側では14桁に左ゼロ埋めして正規化するのが実務上の定石です。
UPC-A 036000291452 → 00036000291452 EAN-13 4901234567894 → 04901234567894 ITF-14 14901234567891 → 14901234567891
これで比較・結合・重複判定がすべて同一のキーで行えます。表示するときだけ元の桁数に戻します。
UPC-Eに注意
UPC-Eは8桁ですが、GTIN-8とは別物です。UPC-Eは12桁UPC-Aのゼロ抑制表現で、展開しないと正しいGTINになりません。桁数だけで判定すると取り違えます。スキャナー側で12桁に展開して送出する設定が安全です。
2. 先頭のゼロを守る
GTINは数値ではなく文字列です。数値型で保持すると先頭のゼロが消えます。
- データベース——INT/BIGINTではなくCHAR/VARCHARを使う
- Excel・スプレッドシート——セル書式を「文字列」にする。数値のままだと
0012345が12345になり、13桁は4.90123E+12と指数表記になります - CSV——インポート時の型推論に注意。多くのツールが数値と判定します
- JSON——数値リテラルではなく文字列で持つ
先頭ゼロが消えたGTINはチェックデジット検証に通らず、原因の特定に時間がかかります。
3. チェックデジットを保持する
チェックデジットは計算で導けますが、保存する値には含めてください。除いて保存すると、外部システムとの受け渡しのたびに再計算が必要になり、計算方法の取り違えによるバグが入ります。
形式ごとに重み付けの開始が異なる点に注意してください。EAN-13は左から1・3・1・3、EAN-8とUPC-Aは3・1・3・1です。同じ関数で処理すると誤った値になります。
4. 入力値のサニタイズ
スキャナーやCSVから受け取る値には、しばしば余計な文字が混入します。
- 末尾の改行・タブ——キーボードウェッジの接尾辞設定によるもの
- 前後の空白——コピー&ペーストで混入
- 全角数字・全角ハイフン——別文字として扱われます
- Code 39のアスタリスク——区切り記号がデータに含まれる場合があります
- Codabarのスタート/ストップ文字(A〜D)——同上
保存前に正規化処理を通し、何を除去したかをログに残すと、後の調査が容易になります。
5. 機密性への配慮
バーコードの値をURLパラメータに含めると、アクセスログ、リファラ、CDNのキャッシュ、ブラウザ履歴に商品コードが残ります。社外秘のコードを扱う場合はPOSTを使うか、ブラウザ内で生成する方式を検討してください。
関連ページ
執筆:Anna Smith | 公開日:2026年8月22日 | 最終更新:2026年8月22日
規格に関する記述はGS1およびJIS/ISOの公開仕様を参照しています。誤りはお問い合わせよりご指摘ください。