Oracle Database 10gの場合、データベースの文字コードをAL32UTF8に指定してデータベースを作成する事でサロゲートペアも扱えるようになりますが、文字型フィールドの最大長に注意しなければなりません。
例えば、次のようにVARCHAR2とNVARCHAR2に指定できる最大長を指定してテーブル定義を行うと何文字はいるでしょうか。
CREATE TABLE TEST
(
MAXLEN VARCHAR2(4000),
MAXLENN NVARCHAR2(2000)
)
/
JA16SJISTILDEでデータベースを作成したときには、「1234567890」を繰り返しいれると最大2000文字はいりました。
SHIFT-JISで格納で格納されるので1文字=2バイトという図式が成立します。試しにVSIZEでサイズを測ると次のような結果になります。
SQL> SELECT VSIZE('は') FROM DUAL;
VSIZE('は')
-----------
2
AL32UTF8でデータベースを作成したときには、
MAXLEN列にもMAXLENN列にも「1234567890」を繰り返しいれると1333文字しか入りません。これはAL32UTF8の場合、サロゲートペア以外は1文字=3バイトとして扱われるからです。
SQL> SELECT VSIZE('は') FROM DUAL;
VSIZE('は')
-----------
3
1333文字×3=3999という訳です。
なお、サロゲートペアな文字「のみ」を入れようとすると1文字=4バイトのためVARCHAR2とNVARCHAR2の最大格納文字数は1000文字という事になってしまいます。