代码之家  ›  专栏  ›  技术社区  ›  SethO

tsql在insert上前缀字符串文字-有这个值吗,还是多余的?

  •  11
  • SethO  · 技术社区  · 14 年前

    我刚继承了一个项目,其代码类似于以下(相当简单)示例:

    DECLARE @Demo TABLE
    (
        Quantity INT,
        Symbol NVARCHAR(10)
    )
    
    INSERT INTO @Demo (Quantity, Symbol)
    SELECT 127, N'IBM'
    

    我感兴趣的是 N 在字符串文本之前。

    我知道前缀 n 指定编码(在本例中为Unicode)。但是,由于select只用于插入一个显然已经是unicode的字段,那么这个值是否会自动向上转换呢?

    我运行的代码没有 n 它似乎可以工作,但我是否遗漏了前一个程序员想要的东西?或者是 n 他/她的疏忽?

    我希望当我通过一个 int 到A decimal 字段(自动上推)。我能把那些去掉吗 n S?

    2 回复  |  直到 14 年前
        1
  •  10
  •   SQLMenace    14 年前

    你的测试不是真的有效,试着用汉字来代替,我记得如果你不给它加前缀,它就不会插入正确的字符。

    例如,第一个显示问号,下一个显示正方形

    select '作'
    
    select N'作'
    

    一个更好的例子,即使在这里,输出也不相同

    declare @v nvarchar(50), @v2 nvarchar(50)
    
    select @v = '作', @v2 = N'作'
    
    select @v,@v2
    

    因为你看起来像一个股票表,为什么你要使用Unicode,有没有Unicode的符号,我从来没有见过,这包括isin,cusips和sedols

        2
  •  4
  •   araqnid    14 年前

    是的,SQL Server将自动将varchar转换(加宽、强制转换)为n varchar,因此在这种情况下可以删除n。当然,如果您指定的字符串文本中的字符实际上不在数据库的默认排序规则中,那么您需要它。

    就好像你可以在一个数字后面加上“l”在c等人中表示它是一个长的文字而不是一个整数。根据你的观点,写“ibm”不是精确的,就是习惯的奴隶。

    粗心的人有一个陷阱:nvarchar不会自动转换为varchar,如果您的应用程序都是Unicode,而您的数据库不是,这可能是一个问题。例如,我们使用jtd jdbc驱动程序进行了此操作,它将所有参数值绑定为nvarchar,从而有效地生成如下语句:

    select * from purchase where purchase_reference = N'AB1234'
    

    (其中purchase_reference是varchar列)

    由于自动转换只是一种方式,因此:

    select * from purchase where CONVERT(NVARCHAR, purchase_reference) = N'AB1234'
    

    因此没有使用购买参考指数。

    相反,如果purchase_引用是nvarchar,并且应用程序传入了varchar参数,则重写的查询:

    select * from purchase where purchase_reference = CONVERT(NVARCHAR, 'AB1234')
    

    就好了。最后,我们不得不将绑定参数禁用为Unicode,从而导致一系列被认为不太严重的I18N问题。