web-dev-qa-db-ja.com

OracleでのN'String 'とU'String'リテラルの違い

これらのクエリの意味と違いは何ですか?

SELECT U'String' FROM dual;

そして

SELECT N'String' FROM dual;
19
Ganesh

この回答では、公式リソースから情報を提供しようとします

(1)N ''テキストリテラル

N''は、文字列をNCHARまたはNVARCHAR2データ型に変換するために使用されます

このOracleドキュメントによると Oracle-Literals

テキストリテラルの構文は次のとおりです。

enter image description here

Nまたはnは、国別文字セット(NCHARまたはNVARCHAR2データ)を使用してリテラルを指定します。

この2番目の記事でも Oracle-Datatypes

N'String'は、文字列をNCHARデータ型に変換するために使用されます

上記の記事から:

次の例では、translated_descriptionテーブルのpm.product_descriptions列をnational character set stringと比較します。

SELECT translated_description FROM product_descriptions
  WHERE translated_name = N'LCD Monitor 11/PM';

(2)U ''リテラル

U''は、Oracle Call Interface(OCI)でSQL NCHAR文字列リテラルを処理するために使用されます

このOracleドキュメントに基づいて nicodeによるプログラミング

Oracle Call Interface(OCI)は、残りのクライアント側データベースアクセス製品が使用する最低レベルのAPIです。 C/C++プログラムがSQL CHARおよびNCHARデータ型に格納されているUnicodeデータにアクセスするための柔軟な方法を提供します。 OCIを使用すると、挿入または取得するデータの文字セット(UTF-8、UTF-16など)をプログラムで指定できます。 Oracle Netを介してデータベースにアクセスします。

OCIは、データベースにアクセスするための最低レベルのAPIであるため、可能な限り最高のパフォーマンスを提供します。

OCIでのSQL NCHAR文字列リテラルの処理

環境変数ORA_NCHAR_LITERAL_REPLACETRUEに設定することで、スイッチをオンにできます。 OCIEnvCreate()およびOCIEnvNlsCreate()OCI_NCHAR_LITERAL_REPLACE_ONおよびOCI_NCHAR_LITERAL_REPLACE_OFFモードを使用して、プログラムでこの動作を実現することもできます。したがって、たとえば、OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON)NCHARリテラル置換をオンにし、OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF)はそれをオフにします。

[...] NCHARリテラル置換がオンになっている場合、OCIStmtPrepareおよびOCIStmtPrepare2は、SQLテキスト内のN'リテラルでU'リテラルを変換することに注意してください。結果のSQLテキストをステートメントハンドルに格納します。したがって、アプリケーションがOCI_ATTR_STATEMENTを使用してOCIステートメントハンドルからSQLテキストを取得する場合、SQLテキストは、元のテキストで指定されたU'の代わりにN'を返します


(3)質問に対する回答

データ型の観点から、提供された両方のクエリに違いはありません

13
Hadi
  • _N'string'_は、NCHAR型として_string_を返すだけです。

  • _U'string'_はNCHAR型も返しますが、_string_に追加の処理を行います:_\\_を_\_に、_\xxxx_をUnicodeコードに置き換えますポイント_U+xxxx_、ここで_xxxx_は4桁の16進数です。これはUNISTR('string')と似ていますが、違いは後者が_NVARCHAR2_を返すことです。

_U'_リテラルは、エンコードおよびNLS設定から独立したUnicode文字列を持ちたい場合に便利です。

例:

_select n'\€', u'\\\20ac', n'\\\20ac' from dual;

N'\€' U'\\\20AC' N'\\\20AC'
----- ---------- ----------
\€    \€         \\\20ac
_
5
mik

N'を使用する場合、特定のデータ型がNCHARまたはNVARCHARであることを示します。

U'はUnicodeを示すために使用されます

5
apomene