В чем смысл и разница между этими запросами?
SELECT U'a' FROM dual;
и
SELECT N'a' FROM dual;
В чем смысл и разница между этими запросами?
SELECT U'a' FROM dual;
и
SELECT N'a' FROM dual;
В этом ответе я попытаюсь предоставить информацию из официальных ресурсов
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';
U'' используется для обработки литералов SQL NCHAR String в Oracle Call Interface (OCI)
Основываясь на этой документации Oracle Программирование в Юникоде
Интерфейс Oracle Call (OCI) - это API самого низкого уровня, который использует остальные продукты доступа к базе данных на стороне клиента. Он обеспечивает гибкий способ для программ C/С++ получать доступ к данным Unicode, хранящимся в типах данных
CHARиNCHARSQL. Используя 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', как указано в исходном тексте.
С точки зрения данных, нет разницы между обоими запросами
при использовании N' мы обозначаем, что данный тип данных NCHAR или NVARCHAR.
U' используется для обозначения unicode