首页 文章

T-SQL语句中前缀N的含义是什么?

提问于
浏览
286

我在一些插入T-SQL查询中看到了前缀N.在将值插入表中之前,许多人使用了 N .

我搜索了,但是我无法理解在将任何字符串插入表格之前包含 N 的目的是什么 .

INSERT INTO Personnel.Employees
 VALUES(N'29730', N'Philippe', N'Horsford', 20.05, 1),

4 回答

  • 349

    它将字符串声明为 nvarchar 数据类型,而不是 varchar

    您可能已经看到使用N前缀传递字符串的Transact-SQL代码 . 这表示后续字符串是Unicode(N实际上代表国家语言字符集) . 这意味着您传递的是NCHAR,NVARCHAR或NTEXT值,而不是CHAR,VARCHAR或TEXT .

    引用from Microsoft

    前缀带字母N的Unicode字符串常量 . 如果没有N前缀,则将字符串转换为数据库的默认代码页 . 此默认代码页可能无法识别某些字符 .


    如果您想知道这两种数据类型之间的区别,请参阅此SO帖子:

    What is the difference between varchar and nvarchar?

  • 0

    让我告诉你N'前缀发生了什么令人讨厌的事情 . 而且我无法修复2天 .

    我的db排序规则是 SQL_Latin1_General_CP1_CI_AS .

    这里有张 table . 栏 MyCol1Nvarchar

    但是这个查询 fails to match Exact 存在的 Value .

    SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = 'ESKİ'  
    
    // 0 result
    

    使用前缀N''修复它

    SELECT TOP 1 * FROM myTable1 WHERE  MyCol1 = N'ESKİ'  
    
    // 1 result - found!!!!
    

    为什么?因为latin1_general没有 big dotted İ 这就是为什么我失败了 .

  • 12

    假设值为nvarchar类型,只有我们使用N''

  • 4
    • 表现:

    假设你的where子句是这样的:

    WHERE NAME='JON'
    

    如果NAME列是nvarchar或nchar以外的任何类型,则不应指定N前缀 . 但是,如果NAME列的类型为nvarchar或nchar,那么如果未指定N前缀,则“JON”将被视为非unicode . 这意味着NAME列的数据类型和字符串'JON'是不同的,因此SQL Server隐式地将一个操作数的类型转换为另一个 . 如果SQL Server将文字的类型转换为列的类型,则没有问题,但如果它以另一种方式执行,那么性能将受到影响,因为不会使用列的索引(如果可用) .

    • 字符集:

    如果列的类型为nvarchar或nchar,则在WHERE / UPDATE / INSERT子句中指定字符串时始终使用前缀N.如果你不这样做,你的字符串中的一个字符是unicode(如国际字符 - 例如 - ā),那么它将失败或遭受数据损坏 .

相关问题