Unicode データを保管する場合は、Unicode 表を作成します。 Unicode データを ASCII 表または EBCDIC 表に挿入するときに、エスケープされたデータを使用しないと、データが失われる場合があります。
このタスクについて
推奨 :オブジェクトを作成する際には、オブジェクト名とカラム名に標準文字を使用してください。 ü や é などの特殊文字は、変換が必要な場合、アプリケーションを複雑にしてしまう可能性があります。
プロシージャー
Unicode 表を作成するには、以下を実行します。
- CREATE DATABASE、CREATE TABLESPACE、または CREATE TABLE ステートメントに、CCSID UNICODE 文節を指定します。
デフォルトでは、表のコード化スキームは、その表スペースのコード化スキームと同じです。 また、表スペースのコード化スキームも、デフォルトでそのデータベースのコード化スキームと同じになります。 CREATE TABLESPACE または CREATE TABLE ステートメントで CCSID 節を使用することで、コード化スキームをオーバーライドできます。 ただし、1 つの表スペース内に存在するすべての表の CCSID が同一である必要があります。
- CREATE TABLE ステートメントで、各列定義について、適切なデータ・タイプ、サブタイプおよび長さの値を指定します。
- データ・タイプ
以下のいずれかのデータ・タイプを使用します。
- UTF-8 データでは、CHAR、VARCHAR、または CLOB 型の列を作成します。
- UTF-16 データでは、GRAPHIC、VARGRAPHIC、または DBCLOB 型の列を作成します。
- バイナリー・データの場合は、BINARY、VARBINARY、および BLOB 型の列を作成します。
推奨: 通常、Unicodeテーブルには長さの異なる列を使用します。Unicode列のバイト数は通常、EBCDIC列の2~3倍になるからです。
一般ガイドラインとしては、常に列全体にデータが取り込まれることがわかっている場合を除き、19 バイト以上の列には可変長を使用します。 例えば、タイム・スタンプを文字形式 (Db2 TIMESTAMP データ・タイプとしてではなく) に保管する場合、いくつかの文字を含む列が必要です。 DB2® 9 では、その数は 26 文字になります。 (ASCII、EBCDIC、または UTF-8 の場合、この列は 26 バイトです。 UTF-16 では、この列は 52 バイトです。) タイム・スタンプは常に同じサイズであるため、可変長列を使用してもストレージは節約されません。 ただし、ASCII または EBCDIC の名前フィールドがあり、26 文字の名前を格納できるとします。 (ASCII SBCS または
EBCDIC SBCS の場合は 26 バイトを使用します。 UTF-8 では 78 バイトが必要です。 UTF-16 では 52 バイトが必要です。) この場合、名前フィールドには複数のブランクが含まれる可能性があり、このような場合にブランクを保存しないようにするため、可変長列を使用できます。
- サブタイプ
- 文字の列の場合、オプションで次のいずれかのサブタイプを指定できます。サブタイプを指定するには、列定義に FOR subtype DATA 文節を追加します。
- SBCS
- 1 バイトとして格納される UTF-8 文字のみからなる列の場合は、このサブタイプを指定します。 このような文字は、Unicode コード・ページの先頭 128 文字です。 Unicode 表の SBCS 文字の列に格納されるデータの CCSID は 367 です。
- MIXED
- 1 バイトよりも大きい UTF-8 データが含まれる列の場合は、このサブタイプを選択します。 MIXED はデフォルト値です。 Unicode 表の文字データは、サブシステムが NO の MIXED DECP 値で定義されている場合でも、デフォルトで混合データとして保管されます。 Unicode 表の MIXED 文字の列に保管されているデータの CCSID は 1208 です。
- ビット
- このサブタイプは、列に BIT データが格納されることを指定します。 FOR BIT DATA 列には CCSID 66534 が関連付けられています。
推奨: BITデータを含むCHARおよびVARCHAR列に対しては、BITサブタイプを指定することもできますが、代わりにBINARYまたはVARBINARYデータ型を使用してください。
国際データを処理する目的でのみ FOR BIT DATA 列を使用することは避けてください。 暗号化などの特定の理由がある場合に限り、FOR BIT DATA 列を使用してください。 このようにしないと、データ・タイプが原因となって問題が発生します。 例えば、長さが 10 の文字列があり、それを長さ 12 の FOR BIT DATA 列に入れると、Db2 は文字列を 2 つの空白で埋め込みます。 この空白に使用される 16 進値はシステムによって異なります。 例えば、EBCDIC では X'40'、Unicode では X'20' が使用されます。 この 16 進値の違いが原因で、このデータを変換するときに問題が発生する可能性があります。
- 長さ
- 適切な長さの値を決定するには、「Unicode データのカラムサイズの見積もり 」の手順に従ってください。
Db2 は、指定されたデータ・タイプに応じて、特定の CCSID を列に関連付けます。 Unicode 表の列データ・タイプと、これらの列のデータに関連付けられる CCSID の要約を次の表に示します。
表 1. Unicode 表の列に関連付けられる CCSID
| 列データ・タイプ |
関連付けられる CCSID |
データの格納形式 |
| CHAR3.a |
1208 |
UTF-8 |
| CHAR FOR SBCS DATA |
367 |
7 ビット ASCII |
| CHAR FOR MIXED DATA |
1208 |
UTF-8 |
| CHAR FOR BIT DATA |
66534 |
NA |
| VARCHAR3.a |
1208 |
UTF-8 |
| VARCHAR FOR SBCS DATA |
367 |
7 ビット ASCII |
| VARCHAR FOR MIXED DATA |
1208 |
UTF-8 |
| VARCHAR FOR BIT DATA |
66534 |
NA |
| CLOB3.a |
1208 |
UTF-8 |
| CLOB FOR SBCS DATA |
367 |
7 ビット ASCII |
| CLOB FOR MIXED DATA |
1208 |
UTF-8 |
| GRAPHIC |
1200 |
UTF-16 |
| VARGRAPHIC |
1200 |
UTF-16 |
| DBCLOB |
1200 |
UTF-16 |
注:
- サブタイプを指定しない場合、Db2 は FOR MIXED DATA を想定します。
|
例
以下の CREATE TABLE ステートメントは、Unicode 表を作成します。CREATE TABLE UNITAB
(C1 CHAR(4)FOR SBCS DATA,
C2 CHAR(4),
C3 GRAPHIC(4),
C4 VARCHAR(4) FOR SBCS DATA,
C5 VARCHAR(4),
C6 VARGRAPHIC(4))
CCSID Unicode

C1 列と C4 列には 1 バイトの UTF-8 データのみを格納できます。 (このデータは 7 ビット ASCII フォーマットで格納され、CCSID は 367 です。) 列 C2 と C5 には任意の UTF-8 データを格納できます。 C3® と C6 の列には、 UTF-16 のデータを格納できます。
CHAR 列と VARCHAR 列の長さは 4 バイトです。 つまり、これらの各列には次のいずれかの文字または文字セットを格納できます。
- 1 つの 4 バイト UTF-8 文字
- 2 つの 2 バイト UTF-8 文字
- 1 つの 3 バイト UTF-8 文字と 1 つの 1 バイト UTF-8 文字
- 4 つの 1 バイト UTF-8 文字
GRAPHIC 列と VARGRAPHIC 列の長さは UTF-16 コード単位 4 つ分です。 (UTF-16 コード単位は 16 ビット (2 バイト) です。) 2 バイトの UTF-16 文字の場合、この長さは 4 文字に相当します。 ただし、この長さは常に 4 文字に相当するわけではありません。 UTF-16 補足文字 (各文字の長さは UTF-16 コード単位 2 つ分、つまり 4 バイト) があるとします。 列に補足文字を格納する場合、4 文字を格納することはできません。 したがって、この列の長さは、文字のサイズに応じて 2 文字、3 文字、または 4 文字となります。 例えば、各 GRAPHIC 列および VARGRAPHIC 列には次のいずれかの文字または文字セットを格納できます。
- 4 つの 2 バイト UTF-16 文字
- 2 つの 4 バイト UTF-16 文字
- 1 つの 4 バイト UTF-16 文字と 2 つの 2 バイト UTF-16 文字