我在某处看到了这个查询-
SELECT *
FROM HR.Employees
WHERE country <> N'JAP';
那个“N”是什么意思?我不确定这是否仅对 SQL Server 有效。
我在某处看到了这个查询-
SELECT *
FROM HR.Employees
WHERE country <> N'JAP';
那个“N”是什么意思?我不确定这是否仅对 SQL Server 有效。
N 代表“国家字符”,表示字符串的内容是Unicode。
每当您可能遇到专有名称或其他实体可能包含默认 ASCII 字符集之外的字符时,您都应该使用 Unicode ( nchar
/ )。nvarchar
如果您不使用N
前缀围绕此类字符串,您将丢失数据。例如:
SELECT N'ук ферт хер', 'ук ферт хер';
结果:
----------- -----------
ук ферт хер ?? ???? ???
您还应该确保在您的或其他子句中对列使用N
前缀。当您不使用前缀时,您可能会因隐式转换而遭受严重的性能问题。WHERE
n(var)char
N
从书中获取的其他信息 - 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';