データ格納に影響する文字セットの長さセマンティクス
文字長およびバイト長セマンティクスは、列長および記憶域サイズについて発生する可能性がある問題を解決するためにサポートされています。UTF-8またはAL32UTF8
などのマルチバイト・エンコードの文字セットがサポートされています。マルチバイト・エンコードでは、1文字に必要な記憶域量が文字によって異なります。たとえば、UTF-8の文字では1から4バイトが必要です。たとえば、CHAR (10)
と定義された列の場合、文字セットのエンコードに関係なく、この列には10文字すべてが収まります。しかし、文字セットのエンコードがUTF-8
の場合は、最大40バイトが必要になります。
キャラクタ・セマンティクスは、可変幅のマルチバイト文字列に必要な記憶域を定義する場合に有効です。たとえば、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バイトの文字データを格納できます。
NCHAR
およびNVARCHAR2
文字データ型はUTF-16としてエンコードされます。これには、各文字に2バイト以上必要です。したがって、表定義のNCHAR(20)
は、40バイトの文字データを格納できます。
文字データ型の新しい列にバイト・セマンティクスとキャラクタ・セマンティクスのどちらが使用されるかは、NLS_LENGTH_SEMANTICS
一般接続属性によって決定されます。これにより、明示的な修飾子を追加する必要なく、バイト長セマンティクスまたは文字長セマンティクスのいずれかを使用して、CHAR
およびVARCHAR2
列を作成できます。NCHAR
およびNVARCHAR2
列は、常に文字ベースです。既存の列は、影響を受けません。
NLS_LENGTH_SEMANTICS
のデフォルト値はBYTE
です。BYTE
またはCHAR
修飾子をデータ型式に指定すると、この値がNLS_LENGTH_SEMANTICS
の値より優先されます。