SQL的where子句中的'N'

时间:2013-08-29 22:24:26

标签: sql sql-server

我在某个地方看到了这个问题 -

SELECT *
FROM HR.Employees
WHERE country <> N'JAP';

“N”是什么意思?我不确定这是否仅对SQL服务器有效。

2 个答案:

答案 0 :(得分:33)

N代表“国家字符”,表示字符串的内容为Unicode

每当您遇到可能包含默认ASCII字符集之外的字符的专有名称或其他实体时,您应该使用Unicode(nchar / nvarchar)。如果您没有使用N前缀包围此类字符串,则会丢失数据。例如:

SELECT N'ук ферт хер', 'ук ферт хер';

结果:

-----------        -----------
ук ферт хер        ?? ???? ???

您还应该确保在NWHERE列的其他条款中使用n(var)char前缀。当您不使用N前缀时,由于隐式转换,您可能会遇到严重的性能问题。

答案 1 :(得分:3)

从书中获取的其他信息 - http://www.amazon.com/Training-Kit-Exam-70-461-Microsoft/dp/0735666059

如果编写的表达式涉及不同类型的操作数,则SQL Server必须应用隐式转换来对齐类型。根据具体情况,隐式转换有时会影响性能。重要的是要知道不同类型的文字的正确形式,并确保使用正确的文字。使用不正确的文字类型的典型示例是Unicode字符串(NVARCHAR和NCHAR类型)。

Unicode字符串文字的正确形式是在文字前面加上大写N,并用单引号分隔文字;例如,N'literal'。对于常规字符串文字,您只需用单引号分隔文字;例如,'文字'。当过滤的列是Unicode类型时,指定常规字符串文字是一种非常典型的坏习惯,如下例所示。

SELECT empid, firstname, lastname
FROM HR.Employees
WHERE lastname = 'Davis';

由于列和文字具有不同的类型,因此SQL Server会隐式转换 一个操作数的类型到另一个。在这个例子中,幸运的是,SQL Server将文字的类型转换为列的类型,因此它仍然可以有效地依赖索引。但是,可能存在隐式转换损害性能的情况。最佳做法是使用正确的形式,如下所示。

SELECT empid, firstname, lastname
FROM HR.Employees
WHERE lastname = N'Davis';