シングルバイト・キャラクタ・セットでは、文字列のバイト数と文字数は同じです。マルチバイト・キャラクタ・セットでは、1つの文字またはコード・ポイントが1バイト以上で構成されています。可変幅キャラクタ・セットでは、バイト長に基づいて文字数を算出することが困難な場合があります。列の長さをバイトで計算することはバイト・セマンティクスと呼ばれ、列の長さを文字で計算することはキャラクタ・セマンティクスと呼ばれます。
キャラクタ・セマンティクスは、可変幅のマルチバイト文字列に必要な記憶域を定義する場合に有効です。たとえば、Unicodeのデータベース(AL32UTF8)で、5文字の英字とともに最大5文字の漢字を格納できるVARCHAR2の列を定義する必要があるとします。バイト・セマンティクスを使用すると、この列には、漢字(3バイト)用に15バイト、英字(1バイト)用に5バイトの合計20バイトが必要になります。キャラクタ・セマンティクスを使用すると、この列には10バイトが必要になります。
次のリストの式ではバイト・セマンティクスを使用しています。CHARおよびVARCHAR2式のBYTE修飾子に注意してください。
CHAR (5 BYTE)
VARCHAR2(20 BYTE)
次のリストの式ではキャラクタ・セマンティクスを使用しています。VARCHAR2式のCHAR修飾子に注意してください。
VARCHAR2(20 CHAR)
SUBSTR(string, 1, 20)
デフォルトでは、CHARおよびVARCHAR2文字データ型は文字ではなくバイトで指定されます。したがって、表定義でCHAR(20)と指定されている場合は、20バイトの文字データを格納できます。
NLS_LENGTH_SEMANTICS一般接続属性によって、文字データ型の新しい列でバイト・セマンティクスを使用するか、キャラクタ・セマンティクスを使用するかが決定されます。この属性を使用すると、明示的な修飾子を追加する必要なく、バイト長セマンティクスまたは文字長セマンティクスを使用してCHARおよびVARCHAR2の列を作成できます。NCHARおよびNVARCHAR2列は常に文字ベースです。既存の列は影響を受けません。
NLS_LENGTH_SEMANTICSのデフォルト値はBYTEです。BYTEまたはCHAR修飾子をデータ型式に指定すると、この値がNLS_LENGTH_SEMANTICSの値より優先されます。
スポンサーリンク