N'在SQL脚本中代表什么?(插入脚本中字符之前使用的字符)

本文关键字:脚本 字符 插入 什么 SQL | 更新日期: 2023-09-27 17:53:25

我生成了一个像这样的sql脚本,

INSERT [dbo].[TableName] ([Sno], [Name], [EmployeeId], [ProjectId], [Experience]) 
VALUES (1, N'Dave', N'ESD157', N'FD080', 7)

我想知道N'到底是什么意思,它在这里的目的是什么。

:通过搜索答案,我能得到的是N'是国家语言标准的前缀,它用于使用unicode数据。但老实说,我对这里N'的具体运算没有一个清晰的概念。我很感激你的帮助,请让它在更多的可以理解的的方式。

N'在SQL脚本中代表什么?(插入脚本中字符之前使用的字符)

N用于指定unicode字符串。

这里有一个很好的讨论:为什么一些SQL字符串有一个'N'前缀?

在您的示例中,不需要N前缀,因为ASCII字符(值小于128)直接映射到unicode。但是,如果您想插入一个非ASCII的名称,则需要N前缀。

INSERT [dbo].[TableName] ([Sno], [Name], [EmployeeId], [ProjectId], [Experience]) 
VALUES (1, N'Wāhi', 'ESD157', 'FD080', 7)

"N"前缀在SQL-92标准中表示国家语言,用于表示unicode字符。

任何时候你传递Unicode数据给SQL Server,你必须用N作为Unicode字符串的前缀

当类型为NVARCHARNCHARNTEXT时使用。

更多信息请参考:为什么一些SQL字符串有一个'N'前缀?

'abcd'[var]char字符串的文字(也可能是text,但varchar(max)现在更常见)-占用4字节内存,并使用SQL服务器配置的任何代码页。N'abcd'n[var]char字符串的字面量(或者ntext,但nvarchar(max)更可取),使用UTF-16占用8字节的内存。这允许完全的国际使用,坦率地说,n[var]char可能应该是大多数系统的默认值。

这表示后面的字符串是Unicode格式( N实际上代表国家语言字符集)。

这意味着您正在传递NCHAR, NVARCHARNTEXT值,而不是CHAR, VARCHARTEXT

N是指定其为字符串类型值。

[N]"tsql_string"

是一个常量字符串。Tsql_string可以是任何nvarchar或varchar数据类型。如果包含N,则字符串被解释为nvarchar数据类型。

每个国家都有自己特定的字母和符号,所以美国英语数据库不能识别英国英语数据库能识别的英镑符号,西班牙语、法语、德语也是如此

其他语言如汉语、日语、希伯来语、阿拉伯语也不使用任何拉丁字符。

所以任何人试图输入任何数据不包含在本地字符集将失败或遭受数据损坏,如果你使用varchar,所以如果有甚至是最渺茫的可能性,你的数据库将需要支持多个本地字符集,那么你必须使用国家化的语言字符集又名unicode又名NChar,它允许字符集国籍与字符记录。提供国际文本支持

同样,将N前缀添加到字符串中指示数据库包括国家代码以及字符代码

DECLARE
   TYPE name_salary_rt IS RECORD (
      table_names     VARCHAR2 (1000),
      counts  NUMBER
   );
VSQL varchar2(2000);
   TYPE name_salary_aat IS TABLE OF name_salary_rt
      INDEX BY PLS_INTEGER;

   l_employees   name_salary_aat;
BEGIN
   EXECUTE IMMEDIATE
      q'[select table_name ,count(*) CountF
           from all_tab_columns  where rownum<100
         group by table_name]'
      BULK COLLECT INTO l_employees;

   FOR indx IN 1 .. l_employees.COUNT
   LOOP
VSQL:=VSQL||'  select '''||l_employees (indx).table_names||''','''|| l_employees (indx).counts ||''' from dual ';
if indx<l_employees.COUNT then
VSQL:=VSQL|| ' union all ';
else
VSQL:=VSQL||';';
end if;

  --    DBMS_OUTPUT.put_line (l_employees (indx).table_names||','|| l_employees (indx).counts);
    --    DBMS_OUTPUT.put_line (l_employees (indx).countf);
   END LOOP;
DBMS_OUTPUT.put_line (VSQL);
-- execute immediate  VSQL; 
END;