Back to guides

バーコードは読めるのにシステムが弾く:エンコードとDBの不一致

スキャナーが鳴ってもデータが正しいとは限りません。きれいに読めるのにシステムが拒否するとき、原因はたいていデータ — 先頭ゼロ、チェックディジットのズレ、見えない文字、列の選び間違い — でありプリンタではありません。

バーコードを読み取ると、スキャナーが鳴り、画面に番号が表示される — それなのにシステムは「品目が見つかりません」と言う。あるいはさらに悪いことに、こっそり別のレコードに一致して、間違った商品が出荷されるまで誰も気づかない。スキャナーが鳴るのは確認のように感じられるため、これは最も危険な失敗です。間違っているのに成功したように見えるのです。

「読めるのに弾かれる」は「まったく読めない」とは別の問題です。プリンタも、静区も、シンボロジーも正常です。不具合はデータそのものにあります。このガイドでは、スキャナーがすることとシステムがすることを分け、符号化された値がデータベースの期待値からずれる具体的な経路と、その不一致を素早く見つける方法を順に解説します。

スキャナーの仕事は読み取るところで終わる

スキャナーが何をするのかを正確に押さえる価値があります。混乱のほとんどはここから始まるからです。バーコードスキャナーは キーボードです。明暗のパターンを文字列に変換し、フォーカスのある場所へ、あなたがタイプしたのとまったく同じように送ります。何かを「検索」するわけでも、検証するわけでもなく、その文字列が正しいかどうかを知っているわけでもありません。

スキャナーの成功条件はただ 1 つ、文字列をデコードできたことです。その文字列が在庫の SKU と一致するか、発注の GTIN と一致するか、倉庫システムが求めるレコードと一致するか — それらはすべてスキャナーの仕事ではありません。

この区別が重要なのは、どこを見るべきかを教えてくれるからです。読み取りが拒否されたとき、あなたがデバッグしているのは次の 2 つのどちらかです。

  1. 符号化された値が間違っている — バーコードの中の文字列が、入れるつもりだった文字列と違う。
  2. システム側の期待値が間違っている — バーコードは正常だが、システムが比較しているフィールド、書式、レコードと一致しない。

拒否された読み取りのほとんどはタイプ 1 であり、タイプ 1 の不具合のほとんどは、少数のデータ衛生上のミスに帰着します。

「正しい」読み取りが壊れる 4 つの層

バーコードは積み重なった 4 つの層だと考えてください。どれも独立して壊れ得ます。

層持っているもの壊れ方
データ欲しい値(SKU、GTIN、シリアル)先頭ゼロの欠落、桁の入れ替わり、列の選び間違い
エンコードその値のバー/スペースへの対応付けチェックディジットの古さ、AI の誤り、シンボロジーの誤り
記号エンコードの物理的な印刷コントラスト、サイズ、静区(これが「読めない」の層)
照合システムによるレコード検索フィールド違い、書式違い、空白、大文字小文字

このガイドが扱うのは 1 番目、2 番目、4 番目の層です。3 番目の層 — 物理的な記号 — は バーコードが読めない 12 の原因 で扱っています。記号レベルの不具合は通常、_まったく_読み取れないことを意味するからです。読み取りが拒否されたということは、最初の 3 つの層は仕事を果たしており、不一致は値にあるということです。

先頭ゼロ:定番の静かな殺し屋

「読めるのに弾かれる」の最も多い原因は、失われた先頭ゼロであり、それはほぼ常に Excel のせいです。

UPC-A は 12 桁、EAN-13 は 13 桁、社内 SKU は 8 桁か 9 桁かもしれません。それらがスプレッドシート上で数値として存在していると、Excel は先頭のゼロを無意味なものとして削り取ります。00123456 は 123456 に、000123456789 は 123456789 になります。その削られた値からバーコードを生成すると、バーコードは誤った短い番号を符号化します。

対策は、識別子をすべての段階で文字列として保つことです — スプレッドシート内で(先頭のアポストロフィ、または文字列書式の列)、書き出し時、そしてバーコードジェネレーター内で。長い数字の指数表記による破損を含む仕組み全体は、Excel と CSV の先頭ゼロに特化したガイド で解説しています。

良い診断習慣は、長さを比較することです。データベースが 13 桁の GTIN を期待しているのに、読み取った値が 11 文字や 12 文字なら、削られた先頭ゼロを最初に疑います。

チェックディジットのズレ:番号が「それらしく」見えるとき

すべての GTIN はチェックディジット — 先行する桁から固定の式で算出される 1 桁 — で終わります。その役目は、桁の入れ替わりや入力ミスを検出することです。落とし穴は、チェックディジットが独立したフィールドではなく_エンコードの一部_だということです。

つまり、実務では 2 つのことが起きます。

  • 桁を編集して再計算を忘れる。 価格、重量、シリアル番号を変更し、スプレッドシートで GTIN を手編集して古いチェックディジットを再利用する。印刷された人間可読行には、チェックディジットが検証を通らない番号が載ります。スキャナーはそれでも読み取ります — たいていはチェックディジットを検証しないからです — しかし検証するシステム(小売 POS、GS1 準拠の検索)は拒否します。
  • 符号化されたバーと印刷された数字が食い違う。 バーコードがある値から生成され、その下の人間可読テキストが別に入力された場合、両者はずれる可能性があります。人はテキストを読んで 123…5 だと思い、スキャナーはバーを読んで 123…7 を得ます。

正しい桁は GS1 チェックディジット電卓 で確認できます。その桁の導出規則は GS1 一般仕様 にあり、あらゆる GTIN の長さと構造についての権威ある情報源です。

人間可読行は嘘をつける

バーのすぐ下(または上)には、符号化されたデータを示すテキスト行 — 人間可読解釈(HRI)— が置かれるのが普通です。スキャナーが失敗したとき、人間が値を入力できるようにするためのものです。

問題は、多くの運用で HRI とバーが別々のものだということです。HRI をバーを生成したフィールドとは別のフィールドから描画していると、テキストは ABC-12345 を示し、バーは ABC-12346 を符号化しているということが起こります。スキャナーはバーを読み、人間はテキストを読み、システムはテキストを決して見ません。結果は、完全に読めるけれど間違っているラベルと、「番号はそこにラベルに書いてある」と主張する倉庫作業者です。

規則はこうです。テキストではなく読み取り結果を信じる。 診断するときは、印刷された HRI ではなく、必ず_読み取った_値をデータベースと比較してください。そしてラベルソフトでは、HRI をバーと同じデータソースにバインドし、ずれないようにします。

空白と見えない文字

間違った文字がいつも見えるとは限りません。バーコードは末尾のスペース、タブ、ノーブレークスペース、改行を符号化でき、読み取り結果にそれが含まれます。システムは ABC123 と ABC123 を比較して拒否します — 画面上では両者はまったく同じに見えます。

これらの文字はたいていコピー&ペーストから入り込んできます。Web ページや PDF からコピーした SKU は、末尾の改行や Unicode の空白を引きずってきて、そのままバーコードに入ることがあります。よくある原因は次の通りです。

  • 末尾のスペース(ASCII 0x20)
  • ノーブレークスペース(U+00A0)— HTML やメールからの貼り付けで多い
  • タブと復帰文字
  • ゼロ幅文字 — ブラウザからのコピーで稀に入る

素早い切り分けテスト:読み取った値をプレーンテキストエディタに貼り付けて長さを数えるか、1 文字ずつ確認します。長さが期待より 1 多ければ、隠れた文字が原因である可能性が高いです。

列の選び間違い

一括作業では、ミスはしばしば単純な「間違った列を書き出した」です。スプレッドシートに社内 SKU、仕入先コード、UPC という 3 つの隣接する列があり、倉庫システムが社内 SKU をキーにしているのにバーコードを仕入先コードから生成してしまう — そんな具合です。バーコードは有効で、読み取りもきれい、そしてすべての品目が拒否されます。

これはバーコードのバグではなくデータマッピングのバグであり、だからこそテストをすり抜けます。_間違った_フィールドに対する 1 回のテスト読み取りでも「成功」してしまうからです。テスターは、そのバーコードの生成元と同じ間違った列と比較しているのです。対策は、マッピングを明示的にすること — ジェネレーターの設定でフィールド名を指定し、元のスプレッドシートではなく既知の正常なレコードに対して検証することです。

SKU と UPC と FNSKU

小売やマーケットプレイスの出品者は、「列の選び間違い」問題の特殊版に直面します。同じ商品に感じられるものに対して 3 つの異なる識別子があるのです。

  • UPC / EAN / GTIN — すべての小売業者をまたいで_製品_を識別する、世界共通の商取引品目番号。
  • SKU — その製品に対する、出品者が定義した社内コード。自社カタログの中だけで一意。
  • FNSKU — Amazon のフルフィルメントネットワーク識別子。FBA 向けにユニットに貼るラベルに印刷されるもの。

これらは置き換えできません。UPC を符号化したバーコードは SKU を期待するシステムと一致せず、FNSKU の代わりに UPC を貼った FBA ユニットは Amazon の入荷ドックで拒否されます。バーコード自体は正常で、_識別子の選択_が間違っているのです。

対策は、各読み取りポイントがどの番号を期待しているかを把握し、まさにそのフィールドからバーコードを生成することです。どのラベルをどのユニットに貼るかは、Amazon が Seller Central で規定しています。

GS1 アプリケーション識別子の混乱

GS1-128(および GS1 DataBar)のバーコードは、データを一連のアプリケーション識別子 — 続くフィールドが_何であるか_を示す短い数字の接頭辞 — として詰め込みます。01 は GTIN、21 はシリアル番号、00 は SSCC、10 はバッチ/ロット、17 は賞味期限です。狙いは、1 つのバーコードが複数のフィールドを運べること、そして AI が受取側のシステムにそれらの解析方法を伝えることです。

失敗モードは、AI が間違っている、または値が間違った AI の下に置かれている、というものです。シリアル番号を AI 01(GTIN)の下に置くと、構造的には有効な GTIN 型の文字列としてデコードされ、素朴なチェックすら通るかもしれません — しかしそれは間違ったスロットの間違ったデータであり、AI で解析するシステムは誤ってルーティングするか拒否します。

これは 2 番目の層(エンコード)のエラーであり、特に可変長フィールドの周辺で、GS1-128 のデータを手で組み立てるときに起こしやすいものです。可変長 AI を終端させる FNC1 文字は最も落とされやすい区切り文字であり、それを落とすと後続のすべてのフィールドがずれてしまいます。AI の定義と区切り文字の規則の権威ある情報源は GS1 一般仕様 です。

不具合を切り分けるチェックリスト

読み取りが拒否されたら、安い順に次を実行してください。

  1. 読み取った値を正確に取り出す。 フィールドに直接ではなく、プレーンテキストエディタに読み取ります。長さと全文字をメモします。
  2. まず長さを比較する。 1 文字不足なら先頭ゼロの欠落、1 文字過多なら隠れた文字が疑わしい。
  3. ラベルではなくデータベースと比較する。 印刷された人間可読行はバーと食い違う可能性があります。
  4. チェックディジットを検証する — 値がチェックディジットで終わるなら 電卓 で。
  5. 識別子の種類を確認する。 UPC か SKU か FNSKU か GS1 AI か — システムが実際に求めているフィールドはこれか。
  6. データマッピングを見直す。 ジェネレーターにはどのスプレッドシート列を投入したか。

どの手順も安価で、拒否のほとんどは 2 番目か 3 番目で解決します。

要点

鳴ったスキャナーは、文字列をデコードできたことしか証明していません。拒否されたということは、その文字列がシステムの期待と違うということであり、それは印刷の問題ではなくほぼ常にデータの問題です。先頭ゼロ、古いチェックディジット、見えない文字、列の選び間違い、識別子の種類の誤りがケースの大半を占めます。印刷されたテキストではなく_読み取った_値をデータベースと比較し、長さを確認し、チェックディジットを検証すれば、たいてい 1 分以内に原因が見つかります。バーコードがまったく読めない場合は、12 のよくある原因 から始めてください。