34

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

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

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

注意:通过搜索我能得到的答案是 N' 是国家语言标准的前缀,它用于使用 unicode 数据。但老实说,我无法清楚地了解 N' 这里的确切操作。感谢您的帮助,请以更易于理解的方式进行。提前致谢。

4

7 回答 7

34

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)
于 2013-01-16T07:28:46.743 回答
12

前缀代表 SQL-92 标准中的"N"National Language,用于表示 unicode 字符。

每次将 Unicode 数据传递给 SQL Server 时,都必须在 Unicode 字符串前面加上N.

当类型为 from或NVARCHAR时使用。NCHARNTEXT

有关更多信息,请参阅:为什么某些 SQL 字符串具有“N”前缀?

于 2013-01-16T07:27:43.320 回答
6

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

于 2013-01-16T07:30:37.823 回答
2

这表示后面的字符串在UnicodeN 实际上代表国家语言字符集)。

这意味着您传递的是NCHAR, NVARCHARorNTEXT值,而不是CHAR, VARCHARor TEXT

于 2013-01-16T07:28:29.173 回答
1

N 是指定它是一个字符串类型的值。

[N]'tsql_string'

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

于 2013-01-16T07:26:59.477 回答
0

每个国家/地区都有自己特定的字母和符号,因此为美国英语建立的数据库将无法识别英国英国数据库会识别的英镑符号,西班牙语、法语、德语也是如此

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

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

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

于 2013-12-02T10:19:53.397 回答
-2
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;

于 2020-10-19T16:21:48.373 回答