データ格納に影響する文字セットの長さセマンティクス

シングルバイト文字セットでは、文字列でのバイト数と文字数は同じです。マルチバイト文字セットでは、1つの文字またはコード・ポイントが1バイト以上で構成されています。可変幅文字セットでは、バイト長に基づいて文字数を算出することが困難な場合があります。列の長さをバイトで計算することはバイト・セマンティクスと呼ばれ、列の長さを文字で計算することはキャラクタ・セマンティクスと呼ばれます。

文字長およびバイト長セマンティクスは、列長および記憶域サイズについて発生する可能性がある問題を解決するためにサポートされています。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の値より優先されます。