Различие между литералами N'String 'vs U'String' в оракуле

В чем смысл и разница между этими запросами?

SELECT U'a' FROM dual;

и

SELECT N'a' FROM dual;

Ответы

Ответ 1

В этом ответе я попытаюсь предоставить информацию из официальных ресурсов

(1) Строковый текст N ''

N'' используется для преобразования строки в NCHAR или NVARCHAR2 datatype

Согласно этой документации Oracle Oracle - Literals

Синтаксис текстовых литералов выглядит следующим образом:

введите описание изображения здесь

где N или N указывает литерал с использованием национального набора символов (NCHAR или NVARCHAR2).

Также в этой статье Oracle - Datatypes

N'String' используется для преобразования строки в NCHAR datatype

Из приведенной выше статьи:

В следующем примере сравнивается столбец translated_description таблицы pm.product_descriptions с национальной строкой набора :

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

(2) U '' Literal

U'' используется для обработки литералов SQL NCHAR String в Oracle Call Interface (OCI)

Основываясь на этой документации Oracle Программирование в Юникоде

Интерфейс Oracle Call (OCI) - это API самого низкого уровня, который использует остальные продукты доступа к базе данных на стороне клиента. Он обеспечивает гибкий способ для программ C/С++ получать доступ к данным Unicode, хранящимся в типах данных CHAR и NCHAR SQL. Используя OCI, вы можете программно указать набор символов (UTF-8, UTF-16 и другие) для данных, которые нужно вставить или получить. Он обращается к базе данных через Oracle Net.

OCI - это API самого низкого уровня для доступа к базе данных, поэтому он обеспечивает наилучшую производительность.

Обработка литералов строк SQL NCHAR в OCI

Вы можете включить его, установив переменную окружения ORA_NCHAR_LITERAL_REPLACE на TRUE. Вы также можете программно реализовать это поведение, используя режимы OCI_NCHAR_LITERAL_REPLACE_ON и OCI_NCHAR_LITERAL_REPLACE_OFF в OCIEnvCreate() и OCIEnvNlsCreate(). Так, например, OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) включает NCHAR литерал замены, а OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) отключает его.

[...] Обратите внимание, что при замене литерала NCHAR, OCIStmtPrepare и OCIStmtPrepare2 преобразует литералы N' с U' литералами в тексте SQL и сохранит полученный SQL-текст в дескрипторе инструкции. Таким образом, если приложение использует OCI_ATTR_STATEMENT для извлечения текста SQL из дескриптора дескриптора OCI, текст SQL вернет U' вместо N', как указано в исходном тексте.


(3) Ответьте на вопрос

С точки зрения данных, нет разницы между обоими запросами

Ответ 2

при использовании N' мы обозначаем, что данный тип данных NCHAR или NVARCHAR.

U' используется для обозначения unicode