【问题标题】:The 'N' in the where clause of SQLSQL的where子句中的'N'
【发布时间】:2013-09-02 12:50:41
【问题描述】:

我在某处看到了这个查询 -

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

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

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

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

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

    结果:

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

    您还应该确保在 WHERE 或针对 n(var)char 列的其他子句中使用 N 前缀。如果您不使用 N 前缀,您可能会因隐式转换而遭受严重的性能问题。

    【讨论】:

    • 我可以获得一些链接以获取更多信息吗?我试过谷歌,但没有得到信息。这是我得到的搜索结果 - stackoverflow.com/questions/3895387/…
    • +1 我一直都知道这是 Unicode,并且从来没有费心去弄清楚 N 代表什么。
    • @blasto 还有一些信息herehere
    【解决方案2】:

    来自本书的其他信息 - 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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多