これらのクエリの意味と違いは何ですか?
SELECT U'String' FROM dual;
そして
SELECT N'String' FROM dual;
この回答では、公式リソースから情報を提供しようとします
N''
は、文字列をNCHAR
またはNVARCHAR2
データ型に変換するために使用されます
このOracleドキュメントによると Oracle-Literals
テキストリテラルの構文は次のとおりです。
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';
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_REPLACE
をTRUE
に設定することで、スイッチをオンにできます。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'
を返します。
データ型の観点から、提供された両方のクエリに違いはありません
_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
_
N'
を使用する場合、特定のデータ型がNCHAR
またはNVARCHAR
であることを示します。
U'
はUnicodeを示すために使用されます