DB2 4 min read

Db2のVARCHARに日本語が入らない ― 文字数とバイト数の逆引き

Db2 の VARCHAR(10) の列に、日本語の文字列が10文字入らないことがあります。

SQL0433N  Value "日本語漢" is too long.  SQLSTATE=22001

UTF-8 のデータベースでは、VARCHAR(n) の n は既定でバイト数です。日本語の多くは1文字3バイトなので、VARCHAR(10) に入るのは3文字までです。

まず見る(結論)

入れようとした値のバイト数と文字数を比べます。

VALUES (LENGTH('日本語漢'), CHARACTER_LENGTH('日本語漢', CODEUNITS32))
-- 12 と 4

列を文字数で定義し直すなら VARCHAR(10 CODEUNITS32) と書きます。この列には日本語も絵文字も10文字まで入りました。

症状 → 原因 → 対処(逆引き)

症状 よくある原因 まず打つ手
日本語が3文字しか入らない 長さがバイト数(1文字3バイト) 列を広げる/CODEUNITS32 で定義する
英数字なら入る長さで、日本語だけ落ちる 同上 LENGTH と CHARACTER_LENGTH(..., CODEUNITS32) を比べる
入るはずの長さなのに落ちる。HEX() が倍の長さ CLP を LANG=C のシェルから実行している LANG を UTF-8 にして db2 terminate → 接続し直す
エラーに列名が無い SQL0433N は値しか出さない 値の長さと列定義を突き合わせる
IMPORT / LOAD は通ったのに値が欠けている SQL3125W で切り捨てて入れている 件数ではなく警告メッセージを見る
手続きの変数の値が途中で切れている 代入は SQL0445W(警告)で切り捨て 変数の長さを見直す
LEFT(列, 3) で3文字取れない 関数の長さもバイト数 単位 CODEUNITS32 を指定する
列を短くする ALTER が SQL0190N VARCHAR は短くできない 新しい列や表を作って移す

DESCRIBE TABLE では、VARCHAR(10 CODEUNITS32) の列の長さは 40 と表示されました。広げる方向の ALTER TABLE ... SET DATA TYPE VARCHAR(30) は、REORG 無しでそのまま使えました。

それでも切り分けられないとき(実機ログつきの詳解)

英数字・日本語・絵文字で入る長さ、LANG=C で日本語が18バイトに化けるときの HEX、IMPORT / LOAD / CAST / SQL PL で切り捨てが警告だけで済む例は、Zennのフル記事にまとめています。

▶ Zennで続きを読む(無料)

Db2のSQL0433N ― VARCHAR(10)に日本語が3文字しか入らない理由とCODEUNITS32


実機ログつきの詳解を読む →

この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。

Zennで読む →