Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Diferença entre literais N'String' vs U'String' no Oracle


Nesta resposta, tentarei fornecer informações de recursos oficiais

(1) O texto N'' Literal


N'' é usado para converter uma string para NCHAR ou NVARCHAR2 tipo de dados

De acordo com esta documentação Oracle Oracle - Literais

A sintaxe dos literais de texto é a seguinte:



onde N ou n especifica o literal usando o conjunto de caracteres nacional (NCHAR ou NVARCHAR2 dados).

Também neste segundo artigo Oracle - Tipos de dados

O N'String' é usado para converter uma string para NCHAR tipo de dados

Do artigo listado acima:

O exemplo a seguir compara a translated_description coluna do pm.product_descriptions tabela com uma string de conjunto de caracteres nacional :
SELECT translated_description FROM product_descriptions
  WHERE translated_name = N'LCD Monitor 11/PM';

(2) O U'' Literal


U'' é usado para lidar com os literais de string SQL NCHAR no Oracle Call Interface (OCI)

Com base nesta documentação da Oracle Programação com Unicode

A interface de chamada da Oracle (OCI) é a API de nível mais baixo que o restante dos produtos de acesso ao banco de dados do lado do cliente usam. Ele fornece uma maneira flexível para programas C/C++ acessarem dados Unicode armazenados em SQL CHAR e NCHAR tipos de dados. Usando OCI, você pode especificar programaticamente o conjunto de caracteres (UTF-8, UTF-16 e outros) para os dados a serem inseridos ou recuperados. Ele acessa o banco de dados através do Oracle Net.

OCI é a API de nível mais baixo para acessar um banco de dados, por isso oferece o melhor desempenho possível.

Como lidar com literais de string SQL NCHAR em OCI


Você pode ativá-lo definindo a variável de ambiente ORA_NCHAR_LITERAL_REPLACE para TRUE . Você também pode obter esse comportamento programaticamente usando o OCI_NCHAR_LITERAL_REPLACE_ON e OCI_NCHAR_LITERAL_REPLACE_OFF modos em OCIEnvCreate() e OCIEnvNlsCreate() . Assim, por exemplo, OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_ON) ativa NCHAR substituição literal, enquanto OCIEnvCreate(OCI_NCHAR_LITERAL_REPLACE_OFF) desliga.

[...] Observe que, quando o NCHAR substituição literal está ativada, OCIStmtPrepare e OCIStmtPrepare2 transformará N' literais com U' literais no texto SQL e armazenar o texto SQL resultante no identificador de instrução . Assim, se o aplicativo usa OCI_ATTR_STATEMENT para recuperar o texto SQL do OCI identificador de instrução, o texto SQL retornará U' em vez de N' conforme especificado no texto original .

(3) Resposta para sua pergunta


Da perspectiva dos tipos de dados, não há diferença entre as duas consultas fornecidas