Oracleの長さセマンティクス

Oracle 10g XEで作成されるデフォルトインスタンスでは、キャラクタセットがAL32UTF8となっていて、初期状態で問題なく日本語が扱えるようになっている。開発時のテストの為に、9iで作成したデータを一部Excelに書き出して、それを10gXEに入れようとしたところ、9iでは文字コードがJA16SJISだったため、キャラクタのバイト数が2バイト→3バイトとなってしまい、日本語文字列が入っているカラムが指定したバイト数を超えてしまった。
調べたところ、長さセマンティクスという初期化パラメータをいじることで、バイト数だったカラムのサイズ指定を、文字数に変更することができることがわかった。まあ初期化パラメータいじらなくても、テーブル作成時にCHAR(3 CHAR)とか指定してやればいいんだけど、DDL全部を修正するのが面倒なので却下。初期化パラメータの変更手順は以下のとおり。

  1. SQL*PlusでALTER SYSTEM SET NLS_LENGTH_SEMANTICS = 'CHAR'
  2. データベース再起動(これやらないと、新規テーブル作成しても変更されなかった)
  3. テーブル全部再作成

これで、以降作成したテーブルにはデフォルトでキャラクタ・セマンティクスが適用される。
長さセマンティクスっていうのは今回始めて知ったけど、日本語を扱う以上1バイトと2バイト文字が混じるのは考慮すべきで、だったら最初っからキャラクタ・セマンティクスでカラム定義すればいいじゃんって思うんだけど、きちんとOracle理解してる人から見たらどうなんだろ。今度プラチナホルダーに聞いてみよう。