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のフル記事にまとめています。
この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。